如何使用PIVOT或UNPIVOT T T-SQL语法来实现此输出?
我的SQL Server数据库中有下表如何使用PIVOT或UNPIVOT T T-SQL语法来实现此输出?,sql,sql-server,tsql,pivot,unpivot,Sql,Sql Server,Tsql,Pivot,Unpivot,我的SQL Server数据库中有下表 Mkt Property Cat Description Values Date Germany JohnS Ltd SUP RN 150 JUL 16 Germany JohnS Ltd SUP RN 100 JUL 16 Germany JohnS Ltd DLX RN 60
Mkt Property Cat Description Values Date
Germany JohnS Ltd SUP RN 150 JUL 16
Germany JohnS Ltd SUP RN 100 JUL 16
Germany JohnS Ltd DLX RN 60 JUL 16
Germany JohnS Ltd DLX REV 80 JUL 16
Germany JohnS Ltd DLX REV 75 JUL 16
我需要我的T-SQL查询来转换此表(我们称之为TblA),并提供以下输出:
Mkt Date Property Cat RN REV
Germany JUL 16 JohnS Ltd SUP 250 0
Germany JUL 16 JohnS Ltd DLX 60 155
我猜我应该使用PIVOT或UNPIVOT语法来实现这一点,但我对在PIVOT查询中聚合两个值(RN和REV)的需要感到困惑(如果这是正确的方法!)。您需要使用
PIVOT
SELECT Mkt, Date, Property, Cat, RN, REV
From yourtable
Pivot (sum([Values]) for Description in ([RN],[REV])) pv
考虑到
描述的数量
是静态的,否则您需要使用动态透视您需要使用透视
SELECT Mkt, Date, Property, Cat, RN, REV
From yourtable
Pivot (sum([Values]) for Description in ([RN],[REV])) pv
Using Pivot :
CREATE TABLE #Details (Mkt VARCHAR(100), Property VARCHAR(100), Cat
VARCHAR(100), _Description VARCHAR(100), _Values INT,_Date VARCHAR(100))
INSERT INTO #Details ( Mkt, Property , Cat , _Description ,_Values ,
_Date)
SELECT 'Germany','JohnS Ltd','SUP','RN',150,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','SUP','RN',100,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','DLX','RN',60,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','DLX','REV',80,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','DLX','REV',75,'JUL 16'
SELECT *
FROM
(
SELECT Mkt, Property , Cat , _Description ,_Values , _Date
FROM #Details
)A
PIVOT
(
SUM(_Values) FOR _Description IN ([RN],[REV])
)pvt
考虑到
描述的数量是静态的,否则您需要使用动态枢轴Prdp的答案是正确的。以下内容只是为了防止您需要进入动态状态
Using Pivot :
CREATE TABLE #Details (Mkt VARCHAR(100), Property VARCHAR(100), Cat
VARCHAR(100), _Description VARCHAR(100), _Values INT,_Date VARCHAR(100))
INSERT INTO #Details ( Mkt, Property , Cat , _Description ,_Values ,
_Date)
SELECT 'Germany','JohnS Ltd','SUP','RN',150,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','SUP','RN',100,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','DLX','RN',60,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','DLX','REV',80,'JUL 16' UNION ALL
SELECT 'Germany','JohnS Ltd','DLX','REV',75,'JUL 16'
SELECT *
FROM
(
SELECT Mkt, Property , Cat , _Description ,_Values , _Date
FROM #Details
)A
PIVOT
(
SUM(_Values) FOR _Description IN ([RN],[REV])
)pvt
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Description) From YourTable For XML Path('')),1,1,'')
Select @SQL = '
Select [Mkt], [Date], [Property], [Cat],' + @SQL + '
From YourTable
Pivot (Sum([Values]) For [Description] in (' + @SQL + ') ) p'
Exec(@SQL);
返回
Mkt Date Property Cat REV RN
Germany JUL 16 JohnS Ltd DLX 155 60
Germany JUL 16 JohnS Ltd SUP NULL 250
Prdp的答案是正确的。以下内容只是为了防止您需要进入动态状态
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Description) From YourTable For XML Path('')),1,1,'')
Select @SQL = '
Select [Mkt], [Date], [Property], [Cat],' + @SQL + '
From YourTable
Pivot (Sum([Values]) For [Description] in (' + @SQL + ') ) p'
Exec(@SQL);
返回
Mkt Date Property Cat REV RN
Germany JUL 16 JohnS Ltd DLX 155 60
Germany JUL 16 JohnS Ltd SUP NULL 250
在“Pivot”语法之后的解决方案中缺少一个左括号。在“Pivot”语法之后的解决方案中缺少一个左括号。