У меня есть 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.
Я не хочу кодировать все возможные комбинации. есть способ попроще? Спасибо.
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 .
Еще одно предложение:
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
Похожие вопросы
Новые вопросы
tsql
T-SQL (Transact Structured Query Language) - это расширение функциональности SQL, поддерживаемое Sybase ASE и Microsoft SQL Server. Не используйте этот тег для запросов, связанных с MySQL, PostgreSql, Oracle (Pl / SQL). Обратите внимание, что код SQL, который пишется с использованием LINQ, также не будет частью этого тега. Этот тег специально создан для расширенного программирования SQL с использованием Microsoft SQL Server.