SQL Server 2008 展平行
SQL Server 2008 Flatten Rows
我需要将原本每个用户有 4 行的记录集展平为 1 行。我开始使用 PIVOT 功能,但有 2 个字段需要展平(并且数据透视没有按预期工作)。
当前数据结构:
ContactEmail Scenario TRE Updated_On
-------------------------------------------------------------
email@email.com WTD 0.9785 2015-05-12 22:35:14.993
email@email.com MTD 0.9817 2015-05-12 22:35:57.780
email@email.com QTD 0.9542 2015-05-12 23:16:35.227
email@email.com YTD 0.9522 2015-05-12 23:39:56.533
结果应该是:
ContactEmail WTD_TRE WTD_TRE_Updated MTD_TRE MTD_TRE_Updated QTD_TRE QTD_TRE_Updated YTD_TRE YTD_TRE_Updated
--------------------------------------------------------------------------------------------------------------------
email@email.com 0.9785 2015-05-12 0.9817 2015-05-12 0.9542 2015-05-12 0.9522 2015-05-12
如果你对我试过的 PIVOT 感到好奇,就在这里(TRE_* 都是空的)
SELECT *
FROM (SELECT ContactEmail, Round((ISNULL(TRE, 0) * 100), 1) AS "TRE", Scenario, Updated_On
FROM [server].[db].[schema].[table]) AS TREData
PIVOT
(
SUM(TRE)
FOR Scenario
IN ([TRE_WTD],[TRE_MTD],[TRE_QTD],[TRE_YTD])
) AS PivotTable;
创建两个数据透视查询并加入它们...
WITH CurrentDataStructure as (
SELECT 'email@email.com' ContactEmail,
'WTD' Scenario,
0.9785 TRE,
'2015-05-12 22:35:14.993' Updated_On
UNION SELECT 'email@email.com', 'MTD', 0.9817, '2015-05-12 22:35:57.780'
UNION SELECT 'email@email.com', 'QTD', 0.9542, '2015-05-12 23:16:35.227'
UNION SELECT 'email@email.com', 'YTD', 0.9522, '2015-05-12 23:39:56.533'
), TREData as (
SELECT ContactEmail, Round((ISNULL(TRE, 0) * 100), 1) TRE, Scenario, Updated_On
FROM CurrentDataStructure
), TREs AS (
SELECT *
FROM (SELECT ContactEmail, Scenario, TRE FROM TREData) TREData
PIVOT
(
SUM(TRE)
FOR Scenario
IN ([WTD],[MTD],[QTD],[YTD])
) PivotTable
), TREsUpdated AS (
SELECT *
FROM (SELECT ContactEmail, Scenario, Updated_On FROM TREData) TREData
PIVOT
(
MAX(Updated_On)
FOR Scenario
IN ([WTD],[MTD],[QTD],[YTD])
) PivotTable
)
SELECT t.ContactEmail,
t.WTD WTD_TRE, u.WTD WTD_TRE_Updated,
t.MTD MTD_TRE, u.MTD MTD_TRE_Updated,
t.QTD QTD_TRE, u.QTD QTD_TRE_Updated,
t.YTD YTD_TRE, u.YTD YTD_TRE_Updated
FROM TREs as t
INNER JOIN
TREsUpdated as u
ON t.ContactEmail = u.ContactEmail
这已经过测试,应该 运行 就像它一样。
我需要将原本每个用户有 4 行的记录集展平为 1 行。我开始使用 PIVOT 功能,但有 2 个字段需要展平(并且数据透视没有按预期工作)。
当前数据结构:
ContactEmail Scenario TRE Updated_On
-------------------------------------------------------------
email@email.com WTD 0.9785 2015-05-12 22:35:14.993
email@email.com MTD 0.9817 2015-05-12 22:35:57.780
email@email.com QTD 0.9542 2015-05-12 23:16:35.227
email@email.com YTD 0.9522 2015-05-12 23:39:56.533
结果应该是:
ContactEmail WTD_TRE WTD_TRE_Updated MTD_TRE MTD_TRE_Updated QTD_TRE QTD_TRE_Updated YTD_TRE YTD_TRE_Updated
--------------------------------------------------------------------------------------------------------------------
email@email.com 0.9785 2015-05-12 0.9817 2015-05-12 0.9542 2015-05-12 0.9522 2015-05-12
如果你对我试过的 PIVOT 感到好奇,就在这里(TRE_* 都是空的)
SELECT *
FROM (SELECT ContactEmail, Round((ISNULL(TRE, 0) * 100), 1) AS "TRE", Scenario, Updated_On
FROM [server].[db].[schema].[table]) AS TREData
PIVOT
(
SUM(TRE)
FOR Scenario
IN ([TRE_WTD],[TRE_MTD],[TRE_QTD],[TRE_YTD])
) AS PivotTable;
创建两个数据透视查询并加入它们...
WITH CurrentDataStructure as (
SELECT 'email@email.com' ContactEmail,
'WTD' Scenario,
0.9785 TRE,
'2015-05-12 22:35:14.993' Updated_On
UNION SELECT 'email@email.com', 'MTD', 0.9817, '2015-05-12 22:35:57.780'
UNION SELECT 'email@email.com', 'QTD', 0.9542, '2015-05-12 23:16:35.227'
UNION SELECT 'email@email.com', 'YTD', 0.9522, '2015-05-12 23:39:56.533'
), TREData as (
SELECT ContactEmail, Round((ISNULL(TRE, 0) * 100), 1) TRE, Scenario, Updated_On
FROM CurrentDataStructure
), TREs AS (
SELECT *
FROM (SELECT ContactEmail, Scenario, TRE FROM TREData) TREData
PIVOT
(
SUM(TRE)
FOR Scenario
IN ([WTD],[MTD],[QTD],[YTD])
) PivotTable
), TREsUpdated AS (
SELECT *
FROM (SELECT ContactEmail, Scenario, Updated_On FROM TREData) TREData
PIVOT
(
MAX(Updated_On)
FOR Scenario
IN ([WTD],[MTD],[QTD],[YTD])
) PivotTable
)
SELECT t.ContactEmail,
t.WTD WTD_TRE, u.WTD WTD_TRE_Updated,
t.MTD MTD_TRE, u.MTD MTD_TRE_Updated,
t.QTD QTD_TRE, u.QTD QTD_TRE_Updated,
t.YTD YTD_TRE, u.YTD YTD_TRE_Updated
FROM TREs as t
INNER JOIN
TREsUpdated as u
ON t.ContactEmail = u.ContactEmail
这已经过测试,应该 运行 就像它一样。