У меня есть 14 возможных столбцов, каждый из которых может быть либо значением «Y», либо NULL / пустой строкой и более 37 тыс. Строк данных (поэтому вручную не сработает).

Мне нужно знать все строки, в которых отмечены два или более символа «Y». В основном каждая строка должна иметь только один столбец с пометкой «Да», и если у меня есть какие-либо столбцы, у которых более одного, это ошибка, которую мне нужно найти.

I need to test all the possible combinations where 
columnA and columnB are not null, 
and columnA and columnC are not null, then 
columnB and columnC etc.

Я не хочу кодировать все возможные комбинации. есть способ попроще? Спасибо.

0
Elizabeth 24 Окт 2018 в 00:23

2 ответа

Лучший ответ

Вы можете использовать условное суммирование следующим образом:

select * from your_table
where 
(
    iif(columnA ='y',1,0) 
  + iif(columnB ='y',1,0) 
  + iif(columnC ='y',1,0)
  -- etcetra for the remaining columns...
  > 1
)

Вышеупомянутое предложение where вернет все строки, которые имеют более одного столбца со значением y .

3
jpw 23 Окт 2018 в 21:37

Еще одно предложение:

DECLARE @tbl TABLE(ID INT IDENTITY,ColA VARCHAR(10),ColB VARCHAR(10),ColC VARCHAR(10),ColD VARCHAR(10),ColE VARCHAR(10));
INSERT INTO @tbl VALUES(NULL,NULL,NULL,'Y',NULL)
                      ,(NULL,'Y',NULL,'Y',NULL)
                      ,('Y','Y','','Y','')
                      ,(NULL,NULL,NULL,NULL,NULL)
                      ,(NULL,'',NULL,'Y',NULL)
                      ,('Y','',NULL,'Y',NULL)
                      ,('','',NULL,'Y',NULL);
SELECT * 
     ,LEN(CONCAT(ColA,ColB,ColC,ColD,ColE)) CountOfY
FROM @tbl 

Результат

1   NULL    NULL    NULL    Y       NULL    Y       1
2   NULL    Y       NULL    Y       NULL    YY      2
3   Y       Y               Y               YYY     3
4   NULL    NULL    NULL    NULL    NULL            0
5   NULL            NULL    Y       NULL    Y       1
6   Y               NULL    Y       NULL    YY      2
7                   NULL    Y       NULL    Y       1

Это будет используйте CONCAT() (v2012 +) для построения объединенной строки из всех столбцов. Затем проверяем длину строки. Преимущество CONCAT заключается в неявной работе с приведением типов и значениями NULL.

Если ваши столбцы могут содержать другие значения, кроме Y или NULL / пустая строка , мы все равно можем пойти по этому пути, но, конечно, для этого потребуются некоторые изменения ...

Намек

Вы можете использовать это, чтобы получить набор всех строк и применить фильтры любого типа, или вы можете превратить его в WHERE с помощью LEN(...)>1

2
Shnugo 24 Окт 2018 в 07:23
52958038