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フィドルの例

ただし、私のアドバイスはこれを使用しないことです。アプリケーション側でこのようなピボットデータを処理します。

于 2013-02-06T09:57:54.920 に答える
0

会社ごとに 1 つの行が必要な場合は、単純GROUP BYです。

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

予想される出力が示すように、すべてを 1 行にまとめたい場合は、特に会社名を列名の上に表示する場合は、動的 SQL が必要になる可能性が高くなります。これにより、クエリが大幅に複雑になります。

于 2013-02-06T09:54:22.663 に答える