Sql-server这是我的表数据
Companyname Qty Amount tax
A 1 2 2
A 2 4 2
B 1 2 3
C 1 2 2
C 3 2 2
这是我的例外输出。
A B C
Qty Amount tax | Qty Amount tax | Qty Amount tax
3 6 4 1 2 3 4 4 4
公司可以增加
答案 0 :(得分:2)
您可以使用动态SQL执行此操作:
DECLARE @Cols NVARCHAR(MAX) = STUFF((SELECT DISTINCT ',' + QUOTENAME(CompanyName + Col)
FROM T
CROSS JOIN
( VALUES
('_Qty'),
('_Amount'),
('_Tax')
) c (col)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
DECLARE @SQL NVARCHAR(MAX) =
' SELECT *
FROM ( SELECT [Col] = CompanyName + ''_'' + col,
Value
FROM T
UNPIVOT
( Value
FOR Col IN ([Qty], [Amount], [Tax])
) Upvt
) t
PIVOT
( SUM(Value)
FOR [Col] IN (' + @cols + ')
) pvt;'
EXECUTE SP_EXECUTESQL @SQL;
<强> Example on SQL Fiddle 强>
但是我的建议是不要使用它。在应用程序端处理这样的旋转数据。
答案 1 :(得分:0)
如果您希望每家公司有一行,那么这只是一个简单的GROUP BY
;
SELECT Companyname, SUM(Qty) Qty, SUM(Amount) Amount, SUM(tax) tax
FROM myTable
GROUP BY Companyname
如果您确实希望将其全部放在一行中,因为您的预期输出似乎表明,它很可能需要动态SQL,特别是如果您希望公司名称是列名称之上的一行。这会使您的查询显着更复杂。