如何根据sql中的行数据更改重复列

时间:2013-02-06 09:36:32

标签: sql sql-server tsql pivot

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

公司可以增加

2 个答案:

答案 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,特别是如果您希望公司名称是列名称之上的一行。这会使您的查询显着更复杂。