Кодирование 14!комбинации столбца пустоты - PullRequest
0 голосов
/ 24 октября 2018

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

Мне нужно знать все строки, которые отмечены двумя или более «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.

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

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Другое предложение:

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

0 голосов
/ 24 октября 2018

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

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 .

...