2012-09-07 61 views
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 

就不能研究如何去做。谢谢。

回答

0

您可以通过使用PIVOTGROUP 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 
2

尝试PIVOT

SELECT ID,[sent],[open],[bounce],[click] 
FROM your_table 
PIVOT (COUNT([Type]) 
FOR [Type] in ([sent],[open],[bounce],[click]))p 


SQL Fiddle Demo

0
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 

如果不会给你确切的答案,然后尝试次数(不同的情况....):)