SQL 将行分组到列

SQL group rows to columns

我有一个table

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

想要一个这样的table;

        | 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;

这是一个快速的动态枢轴。我们使用 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);

Returns

EDIT - For the Revised Question

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);

Returns

您所拥有的 Table 应该是它在您的 SQL 数据库中的样子。列保留用于对数据进行分类,行是您添加新实例的地方。

您需要做的是设置您的 ASP、Excel 枢轴 Table,或任何您用来 显示数据将其格式化为水平 table。我需要知道您正在使用什么来连接您的数据库来给您举个例子。