我有一张桌子
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;
答案 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);
返回
编辑 - 针对修订后的问题
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);
返回
答案 1 :(得分:-1)
您拥有的表是它在SQL数据库中的应用方式。列保留用于对数据进行分类,行是添加新实例的位置。
您需要做的是设置ASP,Excel数据透视表或任何用于显示数据的格式,以将其格式化为水平表格。我需要知道您使用什么来与数据库进行交互以提供示例。