2013-03-20 2 views
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 

Что мне нужно для а1 и b1 строк, чтобы иметь нуль в PRICE_1 колонке и цена в price_2 колонке.

ответ

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' 
+0

Perfect. Спасибо! – Dave

+0

Мне нужно иметь это как вид, который был изменен следующим образом: два получают обе цены, но получают 4 строки для каждого элемента теперь, поскольку полное соединение дает мне 2x2 строки: Выберите coalesce (a.Name, b.Name) Имя, a.Цена as price1, b.price as price2 From table1 a Full Join table1 b On b.name = a.Name – Dave

+0

ahh забыли полное условие присоединения на pricetype, изменили его ... –

1

Чарльз дал мне представление о том, с помощью полное присоединение и после игры, я получил это, чтобы работать.

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 

, и это прекрасно работает, используя вид.

Рад иметь любые другие предложения и комментарии.

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 demo

Смежные вопросы