Выберите несколько строк в зависимости от значений столбца - PullRequest
1 голос
/ 28 марта 2019

У меня есть такая таблица:

+----------+----------+----------+----------+----------+
| COLI_KEY | COLI_DAY | COLI_WEE | COLI_MON | COLI_YEA |
+----------+----------+----------+----------+----------+
|        1 | 1        | NULL     |        1 | NULL     |
|        2 | NULL     | NULL     |        1 | 1        |
|        3 | 1        | 1        |        1 | 1        |
+----------+----------+----------+----------+----------+

Я хотел бы получить каждую строку для каждого значения в COLI_DAY, COLI_WEE, COLI_MON, COLI_YEA.Поэтому в основном мне нужен оператор SELECT, который даст мне желаемый результат (в каждой строке отмечен только один столбец, остальные столбцы - нулевые):

+----------+----------+----------+----------+----------+
| COLI_KEY | COLI_DAY | COLI_WEE | COLI_MON | COLI_YEA |
+----------+----------+----------+----------+----------+
|        1 | 1        | null     | null     | null     |
|        1 | null     | null     | 1        | null     |
|        2 | null     | null     | 1        | null     |
|        2 | null     | null     | null     | 1        |
|        3 | 1        | null     | null     | null     |
|        3 | null     | 1        | null     | null     |
|        3 | null     | null     | 1        | null     |
|        3 | null     | null     | null     | 1        |
+----------+----------+----------+----------+----------+

Скрипт для создания таблицы:

declare @CACOLI table
(
    COLI_KEY INT,
    COLI_DAY CHAR(1),
    COLI_WEE CHAR(1),
    COLI_MON CHAR(1),
    COLI_YEA CHAR(1)
)

INSERT INTO @CACOLI (COLI_KEY, COLI_DAY, COLI_WEE, COLI_MON, COLI_YEA)
VALUES (1, '1', NULL, '1', NULL),
       (2, NULL, NULL, '1', '1'),
       (3, '1', '1', '1', '1')

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

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

WITH all_keys AS (
    SELECT 1 AS COLI_KEY UNION ALL
    SELECT 2 UNION ALL
    SELECT 3
),
data AS (
    SELECT 1 AS COLI_DAY, NULL AS COLI_WEE, NULL AS COLI_MON,
        NULL AS COLI_YEA UNION ALL
    SELECT NULL, 1, NULL, NULL UNION ALL
    SELECT NULL, NULL, 1, NULL UNION ALL
    SELECT NULL, NULL, NULL, 1
)

SELECT
    a.COLI_KEY,
    d.COLI_DAY,
    d.COLI_WEE,
    d.COLI_MON,
    d.COLI_YEA
FROM all_keys a
CROSS JOIN data d
INNER JOIN yourTable t
    ON t.COLI_KEY = a.COLI_KEY AND
       (t.COLI_DAY = d.COLI_DAY OR
        t.COLI_WEE = d.COLI_WEE OR
        t.COLI_MON = d.COLI_MON OR
        t.COLI_YEA = d.COLI_YEA);

Демо

2 голосов
/ 28 марта 2019

Это простой подход, при котором я выбираю выходные данные для каждого столбца, где он равен одному, оставляя другие значения NULL и объединяю их все.

SELECT
    COLI_KEY, COLI_DAY, NULL AS COLI_WEE, NULL AS COLI_MON, NULL AS COLI_YEA
WHERE 
    COLI_DAY = 1

UNION

SELECT 
    COLI_KEY, NULL AS COLI_DAY, COLI_WEE, NULL AS COLI_MON, NULL AS COLI_YEA
WHERE 
    COLI_WEE = 1

UNION

SELECT
    COLI_KEY, NULL AS COLI_DAY, NULL AS COLI_WEE, COLI_MON, NULL AS COLI_YEA
WHERE 
    COLI_MON = 1

UNION

SELECT
    COLI_KEY, NULL AS COLI_DAY, NULL AS COLI_WEE, NULL AS COLI_MON, COLI_YEA
WHERE 
    COLI_YEA = 1
1 голос
/ 28 марта 2019

Вы также можете достичь этого, используя UNPIVOT и PIVOT, как показано ниже.

;with cte1 
     as (select *,row_number() over(order by (select 1)) rn 
         from   @table s 
                unpivot( [y] 
                        for [x] IN (coli_day,coli_wee,coli_mon,coli_yea) ) u) 
select coli_key,coli_day,coli_wee,coli_mon,coli_yea 
from   cte1 
       pivot(max(y) 
            for x in(coli_day,coli_wee,coli_mon,coli_yea)) pvt 

Демонстрация онлайн

Примечание: Измените @table на фактическое имя таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...