我有一张表格如下:
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
我需要在[Type] / Count列上使用数据透视表,并获取如下表格:
Product #users Date Document Extraction
prodA 60 2013-03-02 113 152
prodB 45 2013-03-02 40 73
其中#user列是按产品划分的总和组,而日期是按产品划分的最大日期组。
这是我到目前为止所得到的:
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;
但我上面的表1实际上是由以下代码组成的:
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;
所以我的问题是,我如何将上面的代码块放在第一个WITH AS中?
由于
答案 0 :(得分:11)
GROUP BY activity, document, extraction
表运算符中不能PIVOT
,PIVOT
运算符会自动推断分组列。但你可以这样写:
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;
这会给你:
| 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;
答案 1 :(得分:0)
您可以使用CTE实现它。
;WITH CTE
AS
(
SELECT *
FROM Sample
PIVOT
(SUM([COUNT]) FOR [TYPE] IN (Document, Extraction)) AS PI
)
SELECT
Product,
SUM(Users) AS Users,
MAX(Date) AS Date,
MAX(Document) AS Document,
MAX(Extraction) AS Extraction
FROM CTE
GROUP BY Product;