返回一组值的计数的专栏中,我有一个这样的表:通过ID
ID Type
----------
1 sent
1 sent
1 open
1 bounce
1 click
2 sent
2 sent
2 open
2 open
2 click
我想要一个查询返回这样的结果:
ID sent open bounce click
1 2 1 1 1
2 2 2 0 1
就不能研究如何去做。谢谢。
返回一组值的计数的专栏中,我有一个这样的表:通过ID
ID Type
----------
1 sent
1 sent
1 open
1 bounce
1 click
2 sent
2 sent
2 open
2 open
2 click
我想要一个查询返回这样的结果:
ID sent open bounce click
1 2 1 1 1
2 2 2 0 1
就不能研究如何去做。谢谢。
您可以通过使用PIVOT
或GROUP BY
得到这样的结果,你甚至可以得到结果,如果你在Type
列有变量值:
测试数据:
CREATE TABLE #t(ID INT, Type VARCHAR(100))
INSERT #t
VALUES
(1, 'sent'),
(1, 'sent'),
(1, 'open'),
(1, 'bounce'),
(1, 'click'),
(2, 'sent'),
(2, 'sent'),
(2, 'open'),
(2, 'open'),
(2, 'click')
PIVOT
方法:
SELECT pvt.*
FROM #t
PIVOT
(
COUNT(Type) FOR Type IN ([sent], [open], [bounce], [click])
) pvt
如果Type
还有其他可能的值,并且您不知道它们提前使用动态PIVOT
:
DECLARE @cols NVARCHAR(1000) = STUFF(
(
SELECT DISTINCT ',[' + Type + ']'
FROM #t
FOR XML PATH('')
), 1, 1, '')
DECLARE @query NVARCHAR(2000) =
'
SELECT pvt.*
FROM #t
PIVOT
(
COUNT(Type) FOR Type IN ('[email protected]+')
) pvt
'
EXEC(@query)
如果你已经知道的固定值Type
,你也可以使用:
SELECT ID,
COUNT(CASE WHEN Type = 'sent' THEN 1 END) [sent],
COUNT(CASE WHEN Type = 'open' THEN 1 END) [open],
COUNT(CASE WHEN Type = 'bounce' THEN 1 END) bounce,
COUNT(CASE WHEN Type = 'click' THEN 1 END) click
FROM #t
GROUP BY ID
尝试PIVOT
SELECT ID,[sent],[open],[bounce],[click]
FROM your_table
PIVOT (COUNT([Type])
FOR [Type] in ([sent],[open],[bounce],[click]))p
Select Id,
count(case When type='sent' then 1 else 0 end) as sent,
count(case when type='open' then 1 else 0 end) as open
From table
Group by Id
如果不会给你确切的答案,然后尝试次数(不同的情况....):)