Сценарий Unpivot Data для решения?

Итак, у меня есть такая таблица

Таблица 1

 Quote Ref | Product A |  Product B  | Product C | Product D
-----------+-----------+-------------+-----------+-----------     
    12     |   222333  |  4748847478 |     0     |     0

Мне нужно выяснить, к какому Business Group принадлежит это, используя приведенную ниже таблицу.

Меня не интересуют поля для продуктов, которые равны нулю, поскольку в предложении нет этих продуктов, поэтому нет бизнес-группы для сопоставления. Для этого предложения столбцы Product A и B имеют ненулевое значение и могут быть сопоставлены с бизнес-группой. ( КЛЮЧЕВОЙ МОМЕНТ )

Таблица 2

Product Line |   Business Group 
Product A    |   Manfacturing 
Product B    | Tech Net

Итак, я смотрю на UNPIVOT данные в таблице 1.

SELECT [QUOTE Ref], [Product Line], [Value]

FROM 
   (SELECT [QUOTE Ref], [Product A], [Product B], [Product C], [Product D]

FROM [Table1]) p
UNPIVOT
   ([Value] FOR [Product Line] 
   IN ([Product A], [Product B], [Product C], [Product D] )
)AS unpvt;

ДАННЫЕ для таблицы 1 теперь такие

 Quote Ref | Product Line |   Value
-----------+--------------+------------
    12     |  Product A   |   222333
    12     |  Product B   | 4748847478
    12     |  Product C   |     0 
    12     |  Product D   |     0

Проблема в том, что 40 тысяч строк СЕЙЧАС становятся 4,7 миллионами строк.

Теперь я знаю, что мне не нужны строки в несводной таблице, где значение линейки продуктов равно нулю. Как я могу удалить эти записи в запросе unpivot или что-то, что я могу сделать с базовой таблицей, прежде чем я даже запущу UNPIVOT? Моя база данных недостаточно велика, чтобы справиться с примерно 20 подобными таблицами и 60 дополнительными миллионами строк в базе данных.


person James Khan    schedule 20.06.2012    source источник


Ответы (1)


Вы должны добавить условие, которое удаляет записи, которые имеют value = 0 в конечном наборе результатов. Вы не можете сделать это в запросе SELECT, который создает данные, поэтому заключите текущий набор результатов в виде подзапроса, например:

;WITH Data AS
(
    SELECT [QUOTE Ref], [Product Line], [Value]
    FROM 
    (
        SELECT [QUOTE Ref], [Product A], [Product B], [Product C], [Product D]
        FROM [Table1]
    ) p
    UNPIVOT
       ([Value] FOR [Product Line] 
       IN ([Product A], [Product B], [Product C], [Product D] )
    )AS unpvt
 )
SELECT * 
FROM DATA 
WHERE Value <> 0;

ДЕМО

person Mahmoud Gamal    schedule 20.06.2012