导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

求一SQL查询语句

yeah_yz 2007-12-08 11:51:08
求一SQL语句
列出销售日报表的单价与金额

在单价表中有包装的区分,有的商品没列在单价表中。没有的就空着,所以链接时要用 Left Join
但有的包装有硬盒、软盒、All之分,(ALL代表不区分包装)
销售表中没包装资料,
所以取单价时 只取单价表的硬盒,如果没硬盒的取ALL,连ALL都没有的就空着。 总之不取软盒的。

但又要求不能用 包装<>'软盒' 为条件。

求一条最简单的语句查询出来。

tabSales(销售表)
字段(品名,数量)
数据如下
白沙,2
红梅,5
双喜,3
中华,6

tabPrice(单价表)
字段
(品名,包装,单价)
白沙,硬盒,5
白沙,软盒,4
红梅,ALL,5
双喜,硬盒,8
双喜,软盒,6.5

我把要创建表和需要数据的语句写出来,帮各位节约时间。请给条语句。
CREATE TABLE [tabPrice] (
[品名] [varchar] (50) NULL ,
[包装] [varchar] (50) NULL ,
[单价] [numeric](18, 2) NULL
)

CREATE TABLE [tabSales] (
[品名] [varchar] (50) NULL ,
[数量] [int] NULL
)

insert tabSales (品名,数量)
values ('白沙',2)

insert tabSales(品名,数量)
values ('红梅',5)

insert tabSales(品名,数量)
values ('双喜',3)

insert tabSales(品名,数量)
values ('中华',6)

insert tabPrice(品名,包装,单价)
values ('白沙','硬盒',5)

insert tabPrice(品名,包装,单价)
values ('白沙','软盒',4)

insert tabPrice(品名,包装,单价)
values ('红梅','ALL',5)

insert tabPrice(品名,包装,单价)
values ('双喜','硬盒',8)

insert tabPrice(品名,包装,单价)
values ('双喜','软盒',6.5)

如果用
select A.品名,isnull(单价,0) 单价 ,isnull(单价,0)*数量 金额
from tabSales A
Left join tabprice B
on A.品名=B.品名
就会把软盒的也查出来,就多了。
如果加条件 where 包装<>'软盒' 就把没单价资料的中华去掉了。
...全文
107 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yeah_yz 2007-12-11
楼上正解!
谢谢!
回复
中国风 2007-12-11
取定价的顺序:硬盒\ALL\软盒
回复
中国风 2007-12-11
-->测试数据1: @tabSales
declare @tabSales table (品名 varchar(4),数量 tinyint)
insert into @tabSales
select '白沙',2 union all
select '红梅',5 union all
select '双喜',3 union all
select '中华',6
-->测试数据2: @tabPrice
declare @tabPrice table (品名 varchar(4),包装 varchar(4),单价 numeric(18,2))
insert into @tabPrice
select '白沙','硬盒',5 union all
select '白沙','软盒',4 union all
select '红梅','ALL',5 union all
select '双喜','硬盒',8 union all
select '双喜','软盒',6.5

select
品名,
[单价]=isnull((select top 1 单价 from @tabPrice where 品名=a.品名 order by case when 包装='硬盒' then 1
when 包装='ALL' then 2
when 包装='软盒' then 3 end ),0),
[金额]=isnull((select top 1 单价 from @tabPrice where 品名=a.品名 order by case when 包装='硬盒' then 1
when 包装='ALL' then 2
when 包装='软盒' then 3 end ),0)*数量
from
@tabSales A


(所影响的行数为 4 行)


(所影响的行数为 5 行)

品名 单价 金额
---- -------------------- ------------------------
白沙 5.00 10.00
红梅 5.00 25.00
双喜 8.00 24.00
中华 .00 .00

(所影响的行数为 4 行)


回复
yeah_yz 2007-12-10
再说一次条件:

只有硬盒当然只取硬盒;
同时有硬盒、ALL或者其他的只取硬盒;
没有硬盒,但有ALL 的取ALL;
硬盒、ALL都没有的为空。
回复
十一月猪 2007-12-10

select A.品名,
isnull(单价,0) 单价 ,
isnull(单价,0)*数量 金额
from tabSales A
Left join
(SELECT * FROM tabprice WHERE 包装 = '硬盒'
UNION
SELECT * FROM tabprice WHERE 包装 = 'ALL'
AND 品名 NOT IN ( SELECT 品名 FROM tabprice WHERE 包装 = '硬盒' )
)
B
on A.品名=B.品名
回复
Limpire 2007-12-08
白沙 三种都有,我只取硬盒 的单价 ,语句又要怎样写?
-------------------------
where 包装 = '硬盒'
回复
Limpire 2007-12-08
能不能整个语句中不用 包装 <> '软盒' ?
如果包装中还有 *盒 ,**盒,***盒,****盒 就要写很多了
-----------------------

这还用教啊:

where 包装 in ('硬盒','All')
回复
yeah_yz 2007-12-08
这只是举个例子,实际逻辑中还要复杂些。

能不能整个语句中不用 包装 <> '软盒' ?
如果包装中还有 *盒 ,**盒,***盒,****盒 就要写很多了

实际中能用的就是 'ALL' '硬盒' 。
还有举例的数据还不完全,忘了就再加一个既有 硬盒又有 All的 ,这种情况下就只取 硬盒

把测试数据改成如下
insert tabPrice(品名,包装,单价)
values ('白沙','硬盒',5)

insert tabPrice(品名,包装,单价)
values ('白沙','软盒',4)

insert tabPrice(品名,包装,单价)
values ('白沙','ALL',4.5)

insert tabPrice(品名,包装,单价)
values ('红梅','ALL',5)

insert tabPrice(品名,包装,单价)
values ('双喜','硬盒',8)

insert tabPrice(品名,包装,单价)
values ('双喜','软盒',6.5)

白沙 三种都有,我只取硬盒 的单价 ,语句又要怎样写?

再次说明,这只是一个模拟的例子,可能不符生活逻辑。
回复
Limpire 2007-12-08
/*

(所影响的行数为 4 行)


(所影响的行数为 5 行)

品名 单价 金额
---- -------------------- ------------------------
白沙 5.00 10.00
红梅 5.00 25.00
双喜 8.00 24.00
中华 .00 .00

(所影响的行数为 4 行)

*/
回复
Limpire 2007-12-08
-->测试数据1: @tabSales
declare @tabSales table (品名 varchar(4),数量 tinyint)
insert into @tabSales
select '白沙',2 union all
select '红梅',5 union all
select '双喜',3 union all
select '中华',6
-->测试数据2: @tabPrice
declare @tabPrice table (品名 varchar(4),包装 varchar(4),单价 numeric(18,2))
insert into @tabPrice
select '白沙','硬盒',5 union all
select '白沙','软盒',4 union all
select '红梅','ALL',5 union all
select '双喜','硬盒',8 union all
select '双喜','软盒',6.5

select
A.品名,
isnull(单价,0) 单价,
isnull(单价,0)*数量 金额
from
@tabSales A
Left join
(select * from @tabPrice where 包装<>'软盒') B
on A.品名=B.品名
回复
fa_ge 2007-12-08

CREATE TABLE [tabPrice] (
[品名] [varchar] (50) NULL ,
[包装] [varchar] (50) NULL ,
[单价] [numeric](18, 2) NULL
)

CREATE TABLE [tabSales] (
[品名] [varchar] (50) NULL ,
[数量] [int] NULL
)

insert tabSales (品名,数量)
values ('白沙',2)

insert tabSales(品名,数量)
values ('红梅',5)

insert tabSales(品名,数量)
values ('双喜',3)

insert tabSales(品名,数量)
values ('中华',6)

insert tabPrice(品名,包装,单价)
values ('白沙','硬盒',5)

insert tabPrice(品名,包装,单价)
values ('白沙','软盒',4)

insert tabPrice(品名,包装,单价)
values ('红梅','ALL',5)

insert tabPrice(品名,包装,单价)
values ('双喜','硬盒',8)

insert tabPrice(品名,包装,单价)
values ('双喜','软盒',6.5)

select b.品名,isnull(a.单价,0)单价 ,isnull(a.单价,0)*b.数量 as 金额
from
(
select * from tabprice where 包装<>'软盒'
)a
right join tabsales b
on a.品名=b.品名
/*
品名 单价 金额
-------------------------------------------------- -------------------- -------------------------------
白沙 5.00 10.00
红梅 5.00 25.00
双喜 8.00 24.00
中华 .00 .00

(所影响的行数为 4 行)
*/

回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告