Считать, если функция эквивалентна - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть четыре столбца: команда A, команда B, C команда, команда D.

Каждая запись строки может содержать либо Да, либо Нет в каждом из столбцов. Например, вот так:

A Team    B Team    C Team    D Team
------------------------------------
Yes       Yes       No        No

Я ищу создать дополнительный столбец NumberofTeams, который суммирует, где есть да. Таким образом, в этом случае он вернул бы 2 - указывая, что в нем участвуют 2 команды.

Я собирался попробовать это с помощью функции CASE, но считаю, что это должно охватывать каждую перестановку?

select 
    *, 
    NumberofTeams = select case 
                              when [A Team] = 'Yes' and [B Team] = 'Yes' 
                                 then 2 
                              when [A Team] = 'Yes' and [C Team] = 'Yes' 
                                 then 2

и т. Д.

Если есть «более чистый» способ?

Ответы [ 3 ]

3 голосов
/ 18 февраля 2020

Вот один из способов сделать это:

select
    t.*,
    case when [A Team] = 'Yes' then 1 else 0 end
        + case when [B Team] = 'Yes' then 1 else 0 end
        + case when [C Team] = 'Yes' then 1 else 0 end
        + case when [D Team] = 'Yes' then 1 else 0 end
        as NumberOfTeams
from mytable t
1 голос
/ 18 февраля 2020

Нашел мой ответ здесь: Как вернуть количество, если значения столбца содержат определенные значения c строка в нем

Для всех, кому интересно:

SELECT
    col1, col2, col3, col4,
    (CASE WHEN col1 LIKE '%[_]X%' THEN 1 ELSE 0 END +
     CASE WHEN col2 LIKE '%[_]X%' THEN 1 ELSE 0 END +
     CASE WHEN col3 LIKE '%[_]X%' THEN 1 ELSE 0 END +
     CASE WHEN col4 LIKE '%[_]X%' THEN 1 ELSE 0 END) AS cnt
FROM yourTable
0 голосов
/ 19 февраля 2020

Если единственными вариантами выбора являются 'Yes' и 'No', вы можете воспользоваться ярлыком. Поскольку они различаются по длине на 1, вы можете добавить длину строк и вычесть длину более короткой строки для каждого столбца. Проще говоря, объединить строки, взять общую длину и вычесть достаточно, чтобы учесть нет:

declare @Samples as Table ( ATeam VarChar(3), BTeam VarChar(3), CTeam VarChar(3), DTeam VarChar(3) );
insert into @Samples values ( 'No', 'No', 'No', 'No' ), ( 'Yes', 'No', 'Yes', 'No' ), ( 'Yes', 'Yes', 'Yes', 'Yes' );

select *, Len( ATeam + BTeam + CTeam + DTeam ) - 8 as NumberOfTeams
  from @Samples;
...