0

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

公司可以增加

4

2 回答 2

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;

SQL Fiddle 示例

但是我的建议是不要使用它。在应用程序端处理这样的数据。

于 2013-02-06T09:57:54.920 回答
0

如果您希望每家公司有一行,那很简单GROUP BY

SELECT Companyname, SUM(Qty) Qty, SUM(Amount) Amount, SUM(tax) tax
FROM myTable
GROUP BY Companyname

如果您真的希望所有内容都在一行中,正如您预期的输出似乎表明的那样,它很可能需要动态 SQL,特别是如果您希望公司名称位于列名上方的一行。这将使您的查询更加复杂。

于 2013-02-06T09:54:22.663 回答