Как написать оператор case с несколькими случаями, когда выявляется более одной строки - PullRequest
0 голосов
/ 21 мая 2019

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

Пожалуйста, смотрите код и примеры.Спасибо

Я использую SQL Server 17 Я запрашиваю из таблиц, к которым у меня нет прав доступа, поэтому я не могу создавать таблицы и т. Д. Я ищу запрос и не объявляю и не устанавливаю значения.

      ID,
      CASE
          WHEN ORG1 = 1 THEN 'ORG1'
          WHEN ORG2 = 1 THEN 'ORG2'
          WHEN ORG3 = 1 THEN 'ORG3'
          WHEN ORG4 = 1 THEN 'ORG4'
          WHEN ORG5 = 1 THEN 'ORG5'
      else 'None' end as ORG

FROM TBL

текущая таблица выглядит так:

ID  ORG1   ORG2   ORG3   ORG4   ORG5
1    1      0      0       0     1
2    0      1      1       0     0
3    0      0      1       0     1
4    0      1      0       0     0
5    0      0      0       1     0
6    1      0      0       1     0

Я хочу, чтобы результат выглядел следующим образом:

ID   ORG
1    ORG1
1    ORG5
2    ORG2    
2    ORG3
3    ORG3
3    ORG5
4    ORG2
5    ORG4
6    ORG1
6    ORG4

Что я получаю с моим кодомэто:

ID   ORG
1    ORG1
2    ORG2   
3    ORG3
4    ORG2
5    ORG4
6    ORG1

Ответы [ 5 ]

2 голосов
/ 21 мая 2019

Вы можете использовать это.

-- Sample Data
DECLARE @TBL TABLE (ID  INT, ORG1 INT,  ORG2 INT,  ORG3  INT, ORG4 INT,  ORG5 INT)
INSERT INTO @TBL VALUES
(1, 1, 0, 0, 0, 1),
(2, 0, 1, 1, 0, 0),
(3, 0, 0, 1, 0, 1),
(4, 0, 1, 0, 0, 0),
(5, 0, 0, 0, 1, 0),
(6, 1, 0, 0, 1, 0),
(7, 0, 0, 0, 0, 0)


SELECT ID, UNPVT.ORG FROM @TBL
UNPIVOT( VAL FOR ORG IN ([ORG1], [ORG2], [ORG3], [ORG4], [ORG5])) UNPVT
WHERE VAL = 1

Результат:

ID          ORG
----------- ------------
1           ORG1
1           ORG5
2           ORG2
2           ORG3
3           ORG3
3           ORG5
4           ORG2
5           ORG4
6           ORG1
6           ORG4

Если есть случаи, когда все столбцы равны «0»

SELECT ID, UNPVT.ORG FROM 
    (SELECT *, 
        ([ORG1] + [ORG2] + [ORG3] + [ORG4] + [ORG5])^1 AS [None]
     FROM @TBL) SRC
UNPIVOT( VAL FOR ORG IN ([ORG1], [ORG2], [ORG3], [ORG4], [ORG5], [None])) UNPVT
WHERE VAL = 1

Результат:

ID          ORG
----------- ------------
1           ORG1
1           ORG5
2           ORG2
2           ORG3
3           ORG3
3           ORG5
4           ORG2
5           ORG4
6           ORG1
6           ORG4
7           None
0 голосов
/ 21 мая 2019

Я бы использовал cross apply.Однако вам нужна дополнительная логика для значения 'NONE' - даже если ваши примеры данных не содержат примеров:

SELECT t.ID, v.ORG
FROM TBL t CROSS APPLY
     (VALUES ('ORG1', ORG1),
             ('ORG2', ORG2),
             ('ORG3', ORG3),
             ('ORG4', ORG4),
             ('ORG5', ORG5)
     ) V(ORG, val),
WHERE val = 1
UNION ALL
SELECT t.ID, 'None'
FROM TBL
WHERE ORG1 = 0 AND ORG2 = 0 AND ORG3 = 0 AND ORG4 = 0 AND ORG5 = 0;

или без UNION ALL:

SELECT t.ID, v.ORG
FROM TBL t CROSS APPLY
     (VALUES ('ORG1', ORG1),
             ('ORG2', ORG2),
             ('ORG3', ORG3),
             ('ORG4', ORG4),
             ('ORG5', ORG5),
             ('NONE', (CASE WHEN ORG1 = 0 AND ORG2 = 0 AND ORG3 = 0 AND ORG4 = 0 AND ORG5 = 0 THEN 1 ELSE 0 END))
     ) V(ORG, val),
WHERE val = 1
0 голосов
/ 21 мая 2019

это другой подход

declare @Tbl as table (id int, org1 int, org2 int, org3 int, org4 int, org5 int)

insert into @Tbl values 
(1,1,0,0,0,1),
(2,0,1,1,0,0),
(3,0,0,1,0,1),
(4,0,1,0,0,0),
(5,0,0,0,1,0),
(6,1,0,0,1,0)

select * from @Tbl

declare @temp as table (org varchar(5))
insert into @temp values
('org1'),('org2'),('org3'),('org4'),('org5')

select * from @temp


select * from @Tbl cross join @temp
where (org='org1' and org1=1) or
(org='org2' and org2=1) or
(org='org3' and org3=1) or
(org='org4' and org4=1) or
(org='org5' and org5=1)
order by id
0 голосов
/ 21 мая 2019

сделать unpivot после использования выражения case

select id,org from (
select id, case when org1=1 then 'org1' end as og1,
case when org2=1 then 'org2' end as og2,
case when org3=1 then 'org3' end as og3,
case when org4=1 then 'org4' end as og4,
case when org5=1 then 'org5' end as og5

 from table_name
 ) a unpivot (org for value in (og1,og2,og3,og4,og5)) p

id  org
1   org1
1   org5
2   org2
2   org3
3   org3
3   org5
4   org2
5   org4
6   org1
6   org4

здесь демо

0 голосов
/ 21 мая 2019

Простой подход будет union all примерно так:

select * from
(
  select id, 'ORG1' as org from tbl where org1=1
  union all
  select id, 'ORG2' as org from tbl where org1=2
  union all
  select id, 'ORG3' as org from tbl where org1=3
  union all
  select id, 'ORG4' as org from tbl where org1=4
  union all
  select id, 'ORG5' as org from tbl where org1=5
) as tmp

Я предполагаю, что вы хотите отфильтровать все 0 столбцы. Если нет, просто удалите where clause

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