SQL组行到列

时间:2016-12-09 14:55:55

标签: sql sql-server pivot

我有一张桌子

ID | Customer | Type    | Value |
---+----------+---------+-------+
 1 | John     | Income  |   50  |
 2 | John     | Income  |   20  |
 3 | Mike     | Outcome |  150  |
 4 | Robert   | Income  |  100  |
 5 | John     | Outcome |  300  |

想要一张这样的桌子;

        | John | Mike | Robert | 
--------+------+------+--------+
 Income |  70  |   0  |   100  |
 Outcome| 300  | 150  |     0  |

SQL查询应该是什么?谢谢

问题是客户和类型不是静态的,它们是动态的。 我尝试了什么:

  SELECT 'TotalIncome' AS TotalSalaryByDept, 
    [John], [Mike]
    FROM
    (SELECT Customer, Income
     FROM table001) AS a
    PIVOT
    (
     SUM(Income)
     FOR ID IN ([John], [Mike])
    ) AS b;

2 个答案:

答案 0 :(得分:4)

这是一个快速动态支点。我们使用CROSS APPLY来取消所需的措施。

Declare @SQL varchar(max) 
Select  @SQL = Stuff((Select Distinct ',' + QuoteName(Customer) From YourTable Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
 Select [Type],' + @SQL + '
  From (
        Select Item=A.Customer,B.* 
         From  YourTable A
         Cross Apply (
                       Select Type=''Income'' ,Value=A.Income Union All
                       Select Type=''Outcome'',Value=A.Outcome
                     ) B
       ) A
 Pivot (sum(value) For Item in (' + @SQL + ') ) p'
Exec(@SQL);

返回

enter image description here

  

编辑 - 针对修订后的问题

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Customer) From YourTable Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
 Select [Type],' + @SQL + '
  From  (Select Customer,Type,Value from YourTable ) A
 Pivot (Sum(Value) For [Customer] in (' + @SQL + ') ) p'
Exec(@SQL);

返回

enter image description here

答案 1 :(得分:-1)

您拥有的表是它在SQL数据库中的应用方式。列保留用于对数据进行分类,行是添加新实例的位置。

您需要做的是设置ASP,Excel数据透视表或任何用于显示数据的格式,以将其格式化为水平表格。我需要知道您使用什么来与数据库进行交互以提供示例。