读书人

《求一条SQL查询明细的语句50分有

发布时间: 2012-03-09 16:54:57 作者: rapoo

《求一条SQL查询明细的语句,50分,问题解决马上结几贴》

表1记录:
货物 日期 标志 数量 单价 金额
A 2007-01-01 收 50 10 500
A 2007-01-05 发 10 10 100
B 2007-01-06 收 10 20 200
A 2007-01-20 收 20 10 200
A 2007-02-05 发 20 10 200
A 2007-04-20 收 20 10 200

想得到结果:A //不用考虑单价,只要数量和金额.

// 收入 发出
2007-01-01 A 收 50 500
2007-01-05 A 发 10 100
2007-01-20 A 收 20 200
本月合计: 70 700 10 100
累计: 70 700 10 100
2007-02-05 A 发 20 200
本月合计: 20 200
累计: 70 700 30 300
2007-04-20 A 收 20 200
本月合计: 20 200


累计: 90 900 30 300

[解决办法]
create table tt( 货物 varchar(10),
日期 datetime,
标志 varchar(10),
数量 int,
单价 int,
金额 int )
insert into tt select 'A ', '2007-01-01 ', '收 ', 50, 10, 500
union all select 'A ', '2007-01-05 ', '发 ', 10, 10, 100
union all select 'B ', '2007-01-06 ', '收 ', 10, 20, 200
union all select 'A ', '2007-01-20 ', '收 ', 20, 10, 200
union all select 'A ', '2007-02-05 ', '发 ', 20, 10, 200
union all select 'A ', '2007-04-20 ', '收 ', 20, 10, 200


select
(case when grouping(convert(varchar(7),日期,120))=1 then '累计: '
when grouping(convert(varchar(10),日期,120))=1 then '本月合计: ' else convert(varchar(10),max(日期),120) end),
(case when grouping(convert(varchar(10),日期,120))=1 then ' ' else max(货物) end),
(case when grouping(convert(varchar(10),日期,120))=1 then ' ' else max(标志) end),
isnull(cast(sum(case when 标志= '收 ' then 数量 end)as varchar(10))+ ' '+cast(sum(case when 标志= '收 ' then 金额 end)as varchar(10)), ' ') '收入 ',
isnull(cast(sum(case when 标志= '发 ' then 数量 end)as varchar(10))+ ' '+cast(sum(case when 标志= '发 ' then 金额 end)as varchar(10)), ' ') '发出 '
from tt
group by 货物,convert(varchar(7),日期,120),convert(varchar(10),日期,120) WITH ROLLUP having grouping(货物)=0


收入 发出
---------- ---------- ---------- ---------------------- ----------------------
2007-01-01 A 收 50 500
2007-01-05 A 发 10 100
2007-01-20 A 收 20 200
本月合计: 70 700 10 100
2007-02-05 A 发 20 200
本月合计: 20 200
2007-04-20 A 收 20 200
本月合计: 20 200
累计: 90 900 30 300
2007-01-06 B 收 10 200
本月合计: 10 200
累计: 10 200

(所影响的行数为 12 行)
[解决办法]
declare @t table( 货物 varchar(100), 日期 datetime, 标志 varchar(10), 数量 int, 单价 int, 金额 real)
insert @t
select 'A ', '2007-01-01 ', '收 ', 50, 10, 500 union all
select 'A ', '2007-01-05 ', '发 ', 10, 10, 100 union all
select 'B ', '2007-01-06 ', '收 ', 10, 20, 200 union all
select 'A ', '2007-01-20 ', '收 ', 20, 10, 200 union all
select 'A ', '2007-02-05 ', '发 ', 20, 10, 200 union all
select 'A ', '2007-04-20 ', '收 ', 20, 10, 200

select
日期=case when grouping(货物)= 0 and grouping(month(日期))=0 and grouping(日期)=1 then '本月合计 '
when grouping(货物)= 0 and grouping(month(日期))=1 and grouping(日期)=1 then '累计 '
else convert(varchar(10),日期,120) end,


货物,
标志=max(标志),
[收入-数量]=sum(case when 标志=N '收 ' then 数量 end),
[收入-金额]=sum(case when 标志=N '收 ' then 金额 end),
[发出-数量]=sum(case when 标志=N '发 ' then 数量 end),
[发出-金额]=sum(case when 标志=N '发 ' then 金额 end)
from
@t
where
货物= 'A '
group by
货物,month(日期),日期
with rollup
having
grouping(货物)=0

/*
日期货物标志收入-数量收入-金额发出-数量发出-金额
-------------------------------------------------
2007-01-01A收50500.0NULLNULL
2007-01-05A发NULLNULL10100.0
2007-01-20A收20200.0NULLNULL
本月合计A收70700.010100.0
2007-02-05A发NULLNULL20200.0
本月合计A发NULLNULL20200.0
2007-04-20A收20200.0NULLNULL
本月合计A收20200.0NULLNULL
累计A收90900.030300.0
*/

读书人网 >SQL Server

热点推荐