3

私はここで同様の例と解決策を見てきましたが、これまでのところ(ありがとう)を得ることができましたが、最後のステップを理解することはできません。理想的には、このソリューションは数十万行を組み合わせるのに効率的です。

基本的に、価格タイプ1と価格タイプ2の異なるタイプの価格データを持つアイテムごとに1行または2行の価格データのテーブルがあります。2つの価格を1つの行に結合したテーブル/ビューになります。ただし、それぞれの相対位置を維持し、価格2データのヌルを許可しました。

したがって、このデータがある場合:

CREATE TABLE Table1 ([Name] varchar(2), [type] char(1), [price] decimal(10,2));

INSERT INTO Table1 ([Name], [type], [price])
VALUES
    ('a', '1', '1.20'),
    ('a', '2', '1.25'),
    ('a1','1', '2.99'),
    ('b', '1', '2.20'),
    ('b', '2', '2.25'),
    ('b1','2', '3.99'),
    ('c', '1', '3.20'),
    ('c', '2', '3.25'),
    ('d', '1', '4.20'),
    ('d', '2', '4.25');

このSQLを実行できます:

select name, [1] price_1, [2] price_2
from
(
  select name,
         price,
         row_number() over (partition by name
                            order by type asc) rn
    from table1
) o
pivot (min(price) for rn in ([1], [2])) p

そして、私は次の出力を取得しますが、これは私が望むものには完全には正しくありません。

NAME PRICE_1  PRICE_2
a    1.2      1.25
a1   2.99     (null)
b    2.2      2.25
b1   3.99     (null)
c    3.2      3.25
d    4.2      4.25

必要なのは、a1行とb1行のprice_1列にnullがあり、price_2列にpriceがあることです。

4

3 に答える 3

3

フルジョインはこのトリックを行います...

Insert newTable(name, PriceA, PriceB)
Select coalesce(a.Name, b.Name) Name,
    a.Price, b.price
From oldTable a Full Join oldTable b
   On b.name = a.Name
       and a.Type = [PricetTypeA]
       and b.Type = [PricetTypeB]

または、pricetypeが文字列='A'または'B'の場合、

Insert newTable(name, PriceA, PriceB)
Select coalesce(a.Name, b.Name) Name,
    a.Price, b.price
From oldTable a Full Join oldTable b
   On b.name = a.Name
       and a.Type = 'A'
       and b.Type = 'B'
于 2013-03-20T17:18:06.780 に答える
2

チャールズは私にフルジョインを使うというアイデアをくれました、そして遊んだ後、私はこれを機能させました。

Select coalesce(a.Name, b.name) as name, a.Price as price1, b.price as price2
From      (select name, price from table1 where type='1') a
full Join (select name, price from table1 where type='2') b
On b.name = a.Name

これは、ビューとして使用すると正常に機能します。

他の提案やコメントがあれば嬉しいです。

于 2013-03-20T18:01:09.030 に答える
0

なぜあなたが使っているのかよくわかりませんROW_NUMBERtype代わりに列を使用できます。

select name, [1] price_1, [2] price_2
from
(
  select name,
         price,
         row_number() over (partition by name
                            order by type asc) type rn
    from table1
) o
pivot (min(price) for rn in ([1], [2])) p

SQLFiddleデモ

于 2013-03-20T18:52:25.633 に答える