乌兹的回答部分正确。虽然使用一个分组就足够了,但分组子句中必须包含pass id,这样我们就可以删除重复的人的入学记录。我想问一下
人数
进了门,没有多少入口。
为此,我首先查询每个
pass\u id
如下面的数据集。
entrance_date|door_code|entrance_count|pass_id
2018-03-13 |000C |4 |P0001
2018-03-13 |000C |2 |P0002
2018-03-13 |000C |1 |P0003
2018-03-13 |000C |1 |P0004
2018-03-13 |000B |1 |P0001
2018-03-13 |000B |1 |P0002
2018-03-13 |000B |1 |P0003
2018-03-13 |000B |1 |P0004
2018-03-13 |000A |1 |P0001
.... continued
上面的结果由下面的查询返回。
select
CONVERT(date,substring(entrance_date,0,9)) as [entrance_date], [door_code], count([pass_id]) as [entrance_count], [pass_id]
from dbo.entrance_history
where door_code in ('000A', '000B', '000C'....continued)
group by CONVERT(date,substring(entrance_date,0,9)), [door_code], [pass_id]
现在,我需要在表上方透视以获得我想要的数据集。要获取人数(根据“1人1次通过”规则,由“pass\u id”列标识),我需要
计数
pass\u id。然后我得到这个查询。
declare @doorCode nvarchar(Max) = '''000A'',''000B'',''000C'''
declare @doorCode2 nvarchar(Max) = '[000A],[000B],[000C]'
declare @sql nvarchar(Max);
set @sql = '
select entrance_date, ' + @doorCode2 + '
from (
select
CONVERT(date,substring(entrance_date,0,9)) as [entrance_date], [door_code], [pass_id]
from dbo.entrance_history
where door_code in ('+ @doorCode +')
group by CONVERT(date,substring(entrance_date,0,9)), [door_code], [pass_id]
) as [base_table]
pivot (
count([pass_id])
for [door_code] in ('+ @doorCode2 +')
) as [pvt]
order by entrance_date desc
'
exec sp_executesql @sql
这将返回我想要的数据集。
entrance_date|000A|000B|000C
2018-03-13 |9 |4 |1
2018-03-12 |23 |1 |1
2018-03-11 |18 |1 |1
2018-03-10 |19 |1 |1