我有一张桌子,如下所示:
Product #users Date Count Type prodA 29 2013-02-27 113 Document prodA 31 2013-03-02 152 Extraction prodB 17 2013-02-26 40 Document prodB 28 2013-03-02 73 Extraction
我需要在[类型] /计数列上使用数据透视表,并按以下方式获取表:
Product #users Date Document Extraction prodA 60 2013-03-02 113 152 prodB 45 2013-03-02 40 73
其中#user列是按产品分组的总和,而Date是按产品分组的最大日期。
这是我到目前为止所得到的:
SELECT Product, sum(users), max([Date]), [Document],[Extraction] FROM Table PIVOT ( sum([Count]) FOR [Type] IN ( Document , Extraction)) AS [QUANTITY] GROUP BY activity, document, extraction
但是我的最终结果却给了我类似的东西:
Product #users Date Document Extraction prodA 31 2013-03-02 NULL 152 prodA 29 2013-02-27 113 NULL prodB 28 2013-03-02 NULL 73 prodB 17 2013-02-26 40 NULL
它不是按产品分组的!
有任何想法吗?
编辑:
到目前为止,我有
WITH Pivoted AS ( SELECT * FROM table1 PIVOT ( sum([Count]) FOR [Type] IN ( Document , Extraction) ) AS p ) SELECT product, SUM(Users) AS TotalUsers, MAX(DAte) AS LatestDate, MAX(Document) AS Document, MAX(Extraction) AS Extraction FROM Pivoted GROUP BY Product;
但是我上面的table1实际上是由下面的代码组成的:
WITH a AS( SELECT activity, username, [Last Accessed] = max(DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0)), --[#Users] = count(distinct username), CASE WHEN COUNT(activity)IS NOT NULL THEN 1 ELSE 0 END AS Count, CASE WHEN pageURL LIKE '/Document%' OR pageURL LIKE '/Database%' THEN 'Document' ELSE 'Extraction' END AS [Type] --into #temp from activitylog where pageURL not like '%home%' AND pageURL not like '/Default%' --AND ActDateTime >= @StartDate AND ActDateTime <= @EndDate group by activity, username, --department, DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0), CASE WHEN pageURL LIKE '/Document%' OR pageURL LIKE '/Database%' THEN 'Document' ELSE 'Extraction' END --order by activity--, username, department,DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0) ) ,b as (select activity, count(distinct username) as [Users] , --department , max([Last Accessed]) as [Last Accessed1],count([count])as [Count],[Type] from a --into #temp1 from #temp group by activity, --department, [Type] ) select * from b order by activity;
所以我的问题是,我该如何将使Table1放在上面的第一个WITH AS中的代码块放在上面?
谢谢
您不能GROUP BY activity, document, extraction在PIVOT表运算符内,该PIVOT运算符会自动推断出分组的列。但是您可以这样写:
GROUP BY activity, document, extraction
PIVOT
这将为您提供:
| PRODUCT | TOTALUSERS | LATESTDATE | DOCUMENT | EXTRACTION | ------------------------------------------------------------------------------- | prodA | 60 | March, 02 2013 02:00:00+0000 | 113 | 152 | | prodB | 45 | March, 02 2013 02:00:00+0000 | 40 | 73 |
WITH a AS( SELECT activity, username, [Last Accessed] = max(DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0)), --[#Users] = count(distinct username), CASE WHEN COUNT(activity) IS NOT NULL THEN 1 ELSE 0 END AS Count, CASE WHEN pageURL LIKE '/Document%' OR pageURL LIKE '/Database%' THEN 'Document' ELSE 'Extraction' END AS [Type] from activitylog where pageURL not like '%home%' AND pageURL not like '/Default%' group by activity, username, ... ), Pivoted AS ( SELECT * FROM a PIVOT ( sum([Count]) FOR [Type] IN ( Document , Extraction) ) AS p ) SELECT product, SUM(Users) AS TotalUsers, MAX(DAte) AS LatestDate, MAX(Document) AS Document, MAX(Extraction) AS Extraction FROM Pivoted GROUP BY Product;