Sql 联接计数表

Sql 联接计数表,sql,sql-server,join,count,Sql,Sql Server,Join,Count,我有一张这样的桌子: ID CAT1 CAT2 CAT3 DATE 1 IT NETW cisco1 2015-11-26 2 IT NETW cisco2 2015-11-26 1 IT NETW cisco1 2015-11-27 2 IT NETW cisco2 2015-11-27 3 OT VID dist1 2015-11-26 4 OT VID dist2 2015-11-26 3 O

我有一张这样的桌子:

ID CAT1 CAT2 CAT3 DATE 1 IT NETW cisco1 2015-11-26 2 IT NETW cisco2 2015-11-26 1 IT NETW cisco1 2015-11-27 2 IT NETW cisco2 2015-11-27 3 OT VID dist1 2015-11-26 4 OT VID dist2 2015-11-26 3 OT VID dist1 2015-11-27 4 OT VID dist2 2015-11-27 5 ET ALT flip1 2015-11-26 6 ET ALT flip2 2015-11-26 5 ET ALT flip1 2015-11-27 6 ET ALT flip2 2015-11-27 ecc.. CAT1 CAT2 CAT3 COUNT(2015-11-26) COUNT(2015-11-27) IT NETW cisco1 1 1 IT NETW cisco2 1 1 OT VID dist1 1 1 OT VID dist1 1 1 ET ALT flip1 1 1 ET ALT flip1 1 1 ID CAT1 CAT2 CAT3日期 1 IT网络cisco1 2015-11-26 2 IT网络cisco2 2015-11-26 1 IT网络cisco1 2015-11-27 2 IT网络cisco2 2015-11-27 3 OT视频区1 2015-11-26 4 OT视频区2 2015-11-26 3 OT视频区1 2015-11-27 4 OT视频区2 2015-11-27 5 ET ALT flip1 2015-11-26 6美国东部时间2015年11月26日 5 ET ALT flip1 2015-11-27 6美国东部时间2015年11月27日 ecc。。 我需要这样的计数输出:

ID CAT1 CAT2 CAT3 DATE 1 IT NETW cisco1 2015-11-26 2 IT NETW cisco2 2015-11-26 1 IT NETW cisco1 2015-11-27 2 IT NETW cisco2 2015-11-27 3 OT VID dist1 2015-11-26 4 OT VID dist2 2015-11-26 3 OT VID dist1 2015-11-27 4 OT VID dist2 2015-11-27 5 ET ALT flip1 2015-11-26 6 ET ALT flip2 2015-11-26 5 ET ALT flip1 2015-11-27 6 ET ALT flip2 2015-11-27 ecc.. CAT1 CAT2 CAT3 COUNT(2015-11-26) COUNT(2015-11-27) IT NETW cisco1 1 1 IT NETW cisco2 1 1 OT VID dist1 1 1 OT VID dist1 1 1 ET ALT flip1 1 1 ET ALT flip1 1 1 CAT1 CAT2 CAT3计数(2015-11-26)计数(2015-11-27) IT网络cisco1 IT网络1 OT视频区1 OT视频区1 ET ALT flip1 ET ALT flip1 正如您所看到的,它们是以不同的日期复制的。
但在同一时间,日期为2015-11-27的同一行与2015-11-26不同,在这种情况下,计数应输出0或null。你能帮我做一个简单的查询吗?我正在使用SQLServer2008

按分组。使用
CASE
表达式进行条件计数:

select CAT1, CAT2, CAT3,
       count(case when DATE = '2015-11-26' then 1 end) as cnt_2015-11-26,
       count(case when DATE = '2015-11-27' then 1 end) as cnt_2015-11-27
from tablename
group by CAT1, CAT2, CAT3
编辑

还可以使用衍生表格计算cnt_2015-11-26和cnt_2015-11-27之间的差异:

select CAT1, CAT2, CAT3, cnt_2015-11-26, cnt_2015-11-27,
       cnt_2015-11-26 - cnt_2015-11-27 as difference
from
(
select CAT1, CAT2, CAT3,
       count(case when DATE = '2015-11-26' then 1 end) as cnt_2015-11-26,
       count(case when DATE = '2015-11-27' then 1 end) as cnt_2015-11-27
from tablename
group by CAT1, CAT2, CAT3
) dt

通过使用交叉应用和枢轴,我们也可以

select id,
CAT1,
CAT2,
CAT3,
[2015-11-26] AS 'COUNT[2015-11-26]',
[2015-11-27] AS 'COUNT[2015-11-27]' from (
select id,CAT1,CAT2,CAT3,col,val from @t
    CROSS APPLY (values('2015-11-26',date),('2015-11-27',date))cs(col,val))T
    PIVOT(count(val) FOR COL IN ([2015-11-26],[2015-11-27]))P

分组。条件计数的用例。完美这正是我想要的,如果我想添加另一行,它将是cnt_2015-11-26-2015-11-27之间的差异,该怎么办?我会将当前查询包装到一个派生表中,然后修复主查询中的差异。我几分钟后再补充。回头看看。也许在('2015-11-26'、'2015-11-27')中添加
WHERE DATE将提高性能。试试看速度有没有差别。