枢轴不能按预期工作

时间:2014-01-17 07:50:01

标签: sql sql-server pivot

我的记录如下

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

我需要计算每个日期的汇款和银行。解决方案是什么?

2 个答案:

答案 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