我的记录如下
txn_date remarks
11/1/2013 bank
11/1/2013 bank
11/1/2013 bank
11/2/2013 bank
11/2/2013 remit
11/3/2013 bank
我需要显示以下记录
date remit bank
11/1/2013 0 3
11/2/2013 1 1
11/3/2013 0 1
等等
我试过
SELECT *
FROM (
select txn_date,
case when remarks is NULL then 'bank' else remarks end as remarks
from nibl
) as s
PIVOT
(
count(txn_date)
FOR [remarks] IN (remit,bank)
)AS p
但是结果如下
remit bank
35201 32595
我需要计算每个日期的汇款和银行。解决方案是什么?
答案 0 :(得分:1)
我想不出更简洁的做法,而不是添加额外的虚拟列:
declare @t table (txn_date date,remarks varchar(5))
insert into @t(txn_date,remarks) values
('20131101','bank'),
('20131101','bank'),
('20131101','bank'),
('20131102','bank'),
('20131102','remit'),
('20131103','bank')
;With added as (
select txn_date,remarks,1 as cnt
from @t
)
select txn_date,bank,remit
from added pivot (COUNT(cnt) for remarks in (bank,remit)) t
如果您有一个如下所示的pivot子句:
pivot (COUNT(columnA) for columnB in (...))
columnA
生成的结果集中不存在columnB
而非pivot
。因此,由于我们希望txn_date
能够存活,因此它不能是其中一列。不幸的是,必须在COUNT()
中命名一些列,您不能只执行COUNT(*)
或COUNT(1)
,因此我必须添加一个额外的列。
结果:
txn_date bank remit
---------- ----------- -----------
2013-11-01 3 0
2013-11-02 1 1
2013-11-03 1 0
答案 1 :(得分:1)
我只是将你的计数(txn_date)改为count(备注):
declare @t1 table (txn_date date, remarks varchar(8))
insert into @t1 values
('11/1/2013', 'bank')
,('11/1/2013', 'bank')
,('11/1/2013', 'bank')
,('11/2/2013', 'bank')
,('11/2/2013', 'remit')
,('11/3/2013', 'bank')
SELECT *
FROM (
select txn_date,
case when remarks is NULL then 'bank' else remarks end as remarks
from @t1
) as s
PIVOT
(
count([remarks])
FOR [remarks] IN (remit,bank)
)AS p