SQL получить общее значение по нескольким столбцам - PullRequest
0 голосов
/ 14 мая 2018

У меня есть база данных sql server 2012 с таблицей из 10 столбцов

name test1, test2, test3, test4,....
 bob  yes    no    null    yes
 john  no    yes    yes    null

Я хочу получить все результаты из полей 'test', поэтому я хочу, чтобы мои результаты были

yes = 4
no = 2
null = 2

Я пытался использовать cte, sum, case когда, но я не могу получить результаты, которые я ищу.ниже приведен пример моего sql, если кто-нибудь может сказать мне, как получить результаты, которые я ищу.

       with cte as 
  (
SELECT
test1,
sum (case when test1 = 'yes' then 1 else 0 end) as yes,
sum (case when test1= 'no' then 1 else 0 end) as no,
sum (case when test1 is null then 1 else 0 end) as notset
from names
group by Inspection1Type)
  select 
   sum (yes) as 'yes',
    sum(no) as 'no'
     sum(notset) as 'Not Set'
  from cte;

работает для первого столбца, но не для остальных, так как я ищу то же значение, он жалуется, что мои псевдонимы одинаковы

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Мне нравится обрабатывать это с apply. Если вы хотите одну строку на name:

select n.*, v.*
from names n cross apply
     (select sum(case when v.test = 'yes' then 1 else 0 end) as yes,
             sum(case when v.test = 'no' then 1 else 0 end) as no,
             sum(case when v.test is null then 1 else 0 end) as nulls             
      from (values (n.test1), (n.test2), . . . (n.test10)) v(test)
     ) v;

Если вы хотите одну строку для всех данных:

select sum(case when v.test = 'yes' then 1 else 0 end) as yes,
       sum(case when v.test = 'no' then 1 else 0 end) as no,
       sum(case when v.test is null then 1 else 0 end) as nulls 
from names n cross apply
     (values (n.test1), (n.test2), . . . (n.test10)) v(test);

Наличие повторяющихся столбцов в таблице обычно является признаком проблемы с моделью данных. Обычно вы хотите одну строку на name / test, и это упростит запросы к этим данным.

0 голосов
/ 14 мая 2018

Попробуйте это:

WITH ABC
as
(
SELECT 'bob' as name, 'yes' as test1, 'no' as test2, null as test3, 'yes' as test4
UNION ALL
SELECT 'john', 'no','yes','yes',null
)
SELECT SUM(CASE WHEN A.result = 'yes' then 1 else 0 end) as [Yes], 
       SUM(CASE WHEN A.result = 'no' then 1 else 0 end) as [No],
       SUM(CASE WHEN A.result is null then 1 else 0 end) as [Null]
FROM 
(
    SELECT  name,result
    FROM ABC
    CROSS APPLY(VALUES(test1),(test2),(test3),(test4))  --may add up to test10
    COLUMNNAMES(result)
) as A
0 голосов
/ 14 мая 2018

Попробуйте этот метод вырезания и вставки:

SELECT
    sum (case when test1 = 'yes' then 1 else 0 end
        +case when test2 = 'yes' then 1 else 0 end
        +case when test3 = 'yes' then 1 else 0 end
        ...
        +case when test10 = 'yes' then 1 else 0 end) as yes,
    sum (case when test1 = 'no' then 1 else 0 end
        +case when test2 = 'no' then 1 else 0 end
        +case when test3 = 'no' then 1 else 0 end
        ...
        +case when test10 = 'no' then 1 else 0 end) as no,
    sum (case when test1 is null then 1 else 0 end
        +case when test2 is null then 1 else 0 end
        +case when test3 is null then 1 else 0 end
        ...
        +case when test10 is null then 1 else 0 end) as notset
from names
...