Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PIVOT或UNPIVOT T T-SQL语法来实现此输出?_Sql_Sql Server_Tsql_Pivot_Unpivot - Fatal编程技术网

如何使用PIVOT或UNPIVOT T T-SQL语法来实现此输出?

如何使用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

我的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        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”语法之后的解决方案中缺少一个左括号。