Лучший способ частично UNPIVOT в парах в SQL - PullRequest
1 голос
/ 14 июня 2011

У меня есть следующая таблица

VendorID    EMP1A       EMP2A       EMP1B       EMP2B
----------- ----------- ----------- ----------- -----------
1           4           3           5           4
2           4           1           5           5
3           4           3           5           4
4           4           2           5           5
5           5           1           5           5

Я хочу UNPIVOT попарно, чтобы получить столбцы «A» в одной строке и столбцы «B» в другой

vendorid    employee  orders      employee  orders
----------- --------- ----------- --------- -----------
1           EMP1A     4           EMP2A     3
1           EMP1B     5           EMP2B     4
2           EMP1A     4           EMP2A     1
2           EMP1B     5           EMP2B     5
3           EMP1A     4           EMP2A     3
3           EMP1B     5           EMP2B     4
4           EMP1A     4           EMP2A     2
4           EMP1B     5           EMP2B     5
5           EMP1A     5           EMP2A     1
5           EMP1B     5           EMP2B     5

Это работает, но кажется, что я слишком много работаю

DECLARE @pvt AS TABLE( 
  VendorID INT, 
  EMP1A    INT, 
  EMP2A    INT, 
  EMP1B    INT, 
  EMP2B    INT); 

INSERT INTO @pvt VALUES (1,4,3,5,4),
(2,4,1,5,5),
(3,4,3,5,4),
(4,4,2,5,5),
(5,5,1,5,5)

;WITH piv1 
     AS (SELECT vendorid, 
                employee, 
                orders 
         FROM   (SELECT vendorid, 
                        EMP1A, 
                        EMP1B 
                 FROM   @pvt) p 
                 UNPIVOT (orders FOR employee IN (EMP1A, EMP1B) ) 
                AS 
                unpvt), 
     piv2 
     AS (SELECT vendorid, 
                employee, 
                orders 
         FROM   (SELECT vendorid, 
                        EMP2A, 
                        EMP2B 
                 FROM   @pvt) p UNPIVOT (orders FOR employee IN (EMP2A, EMP2B) ) 
                AS 
                unpvt) 
SELECT piv1.vendorid, 
       piv1.employee, 
       piv1.orders, 
       piv2.employee, 
       piv2.orders 
FROM   piv1 
       INNER JOIN piv2 
         ON piv1.vendorid = piv2.vendorid 
            AND RIGHT(piv1.employee, 1) = RIGHT(piv2.employee, 1) 
WHERE
    piv1.orders > piv2.orders

Примечание: это упрощенный пример, и на самом деле есть 25 пар, которые необходимо преобразовать в строки, и я также хочу легко фильтровать

например. добавление WHERE piv1.orders = piv2.orders производит

vendorid    employee  orders      employee  orders
----------- --------- ----------- --------- -----------
2           EMP1B     5           EMP2B     5
4           EMP1B     5           EMP2B     5
5           EMP1B     5           EMP2B     5

Ответы [ 2 ]

1 голос
/ 15 июня 2011

получается, что я слишком много работал

WITH piv1 
     AS (SELECT vendorid, 
                employee, 
                orders 
         FROM   @pvt p UNPIVOT (orders FOR employee IN (emp1a, emp1b, 
                                                        emp2a, emp2b) ) 
                AS unpvt) 
SELECT piv1.vendorid, 
       piv1.employee, 
       piv1.orders, 
       piv2.employee, 
       piv2.orders 
FROM   piv1 
       INNER JOIN piv1 piv2 
         ON piv1.vendorid = piv2.vendorid 
            AND piv1.employee <> piv2.employee 
            AND RIGHT(piv1.employee, 1) = RIGHT(piv2.employee, 1) 
WHERE  Substring(piv1.employee, 4, 1) <> '2' 
ORDER  BY piv1.vendorid, 
          piv1.employee 

Теперь для добавления пар просто необходимо обновить UNPIVOT например

@pvt p UNPIVOT (orders FOR employee IN (emp1a, emp1b,
                                        emp2a, emp2b,
                                        emp1c, emp2c,
                                        emp1d, emp2d) )
1 голос
/ 14 июня 2011

Это так просто?

SELECT
   vendorid,
   'EMP1A' AS employee, EMP1A AS [order1],
   'EMP2A' AS employee, EMP2A AS [order2]
FROM Mytable
UNION ALL
SELECT
   vendorid,
   'EMP1B', EMP1B,
   'EMP2B', EMP2B
FROM Mytable

Примечание: у вас есть неоднозначные имена столбцов, которые нарушат другие элементы, использующие эти данные

Для дополнительных строк добавьте предложения UNION

...
UNION ALL
SELECT
   vendorid,
   'EMP1C', EMP1C,
   'EMP2C', EMP2C
FROM Mytable
UNION ALL
SELECT
   vendorid,
   'EMP1D', EMP1D,
   'EMP2D', EMP2D
FROM Mytable
...

Для дальнейшей фильтрации (нужны разные имена столбцов)

SELECT ...
FROM
    (
    SELECT
       vendorid,
       'EMP1A' AS employee1, EMP1A AS [order1],
       'EMP2A' AS employee2, EMP2A AS [order2]
    FROM Mytable
    UNION ALL
    SELECT
       vendorid,
       'EMP1B', EMP1B,
       'EMP2B', EMP2B
    FROM Mytable
    UNION ALL
    SELECT
       vendorid,
       'EMP1C', EMP1C,
       'EMP2C', EMP2C
    FROM Mytable
    UNION ALL
    SELECT
       vendorid,
       'EMP1D', EMP1D,
       'EMP2D', EMP2D
    FROM Mytable
    ...
   ) foo
WHERE
   order1 = order2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...