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。我需要知道您正在使用什么来连接您的数据库来给您举个例子。
我有一个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。我需要知道您正在使用什么来连接您的数据库来给您举个例子。