3

我在这里看到了类似的示例和解决方案,它们让我走到了这一步(谢谢),但无法弄清楚最后一步。理想情况下,该解决方案对于组合数十万行是有效的。

基本上我有一个价格数据表,每个项目有 1 行或 2 行,每个项目具有不同类型的价格数据 - 价格类型 1 和价格类型 2。我想最终得到一个表格/视图,将 2 个价格组合到一行但保留每个的相对位置,并允许价格 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 列中具有空值,在 price_2 列中具有价格。

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_NUMBER. 您可以只使用该type列:

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

SQL Fiddle 演示

于 2013-03-20T18:52:25.633 回答