3

複数の行を1つの列にマージしようとしています。私はテーブルを持っています:

COST_ID PRICE_ID PRICE_TIER   COST
1        4         1        850.00
2        4         2        950.00 
3        4         3        1000.00
4        7         1        250.00
5        7         2        275.00
6        7         3        300.00

そして、price_idごとに1行を出力したいのですが、次のようになります。

ID PriceID C1ID C1Cost   C2ID  C2Cost C3ID  C3Cost
1    4      1    850.00    2   950.00   3    1000.00
2    7      4    250.00    5   275.00   6    300.00

ご協力ありがとうございました。

4

3 に答える 3

2

私の好ましい解決策は、次のような条件付き集計を使用することです。

SELECT  ROW_NUMBER() OVER(ORDER BY Price_ID) [ID],
        Price_ID,
        MIN(CASE WHEN Price_Tier = 1 THEN Cost_ID END) [C1ID],
        MIN(CASE WHEN Price_Tier = 1 THEN Cost    END) [C1Cost],
        MIN(CASE WHEN Price_Tier = 2 THEN Cost_ID END) [C2ID],
        MIN(CASE WHEN Price_Tier = 2 THEN Cost    END) [C2Cost],
        MIN(CASE WHEN Price_Tier = 3 THEN Cost_ID END) [C3ID],
        MIN(CASE WHEN Price_Tier = 3 THEN Cost    END) [C3Cost]
FROM    T
GROUP BY Price_ID

ただし、これはSQL-ServerのPIVOT関数を使用して実行することもできます。ただし、PIVOTでは単一のPIVOTで複数のアグリゲートを使用できないため、UNIONが必要です。

SELECT  ROW_NUMBER() OVER(ORDER BY Price_ID) [ID],
        *
FROM    (   SELECT  Price_ID, 'C' + CONVERT(VARCHAR, Price_Tier) + 'Cost' [Price_Tier], MIN(Cost) [Value]
            FROM    T
            GROUP BY Price_ID, Price_Tier
            UNION ALL
            SELECT  Price_ID, 'C' + CONVERT(VARCHAR, Price_Tier) + 'ID' [Price_Tier], MIN(Cost_ID) [Value]
            FROM    T
            GROUP BY Price_ID, Price_Tier
        ) data
        PIVOT
        (   MAX(Value) 
            FOR Price_Tier IN ([C1ID], [C1Cost], [C2ID], [C2Cost], [C3ID], [C3Cost])
        ) Pvt

実証的なSQLフィドル

于 2012-05-21T13:43:29.820 に答える
0

SQLServerにはピボットテーブルがあります。PinalDaveは通常SQLServerに関する優れた入門書を提供します。少なくとも開始する場所です。

于 2012-05-21T13:25:30.507 に答える
0

PRICE_IDとPRICE_TIERが一意のキーを形成する場合、次のように実行できます。

select
      row_number() over (order by PRICE_ID) as ID
    , PRICE_ID as PriceID
    , (select COST_ID from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 1) as C1ID
    , (select COST from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 1) as C1Cost
    , (select COST_ID from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 2) as C2ID
    , (select COST from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 2) as C2Cost
    , (select COST_ID from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 3) as C3ID
    , (select COST from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 3) as C3Cost
from MY_TABLE t
group by PRICE_ID
order by PRICE_ID
于 2012-05-21T13:37:13.653 に答える