2012-03-28 4 views
1

У меня есть одна таблица продуктов с несколькими полями, которые содержат оценки пользователей различных атрибутов:Запрашивание Графы значений полей в одной таблице

product | attr_1_eval | attr_2_eval | attr_3_eval 
ABC  | Correct  | Incorrect  | Null 
DEF  | Incorrect  | Null   | Null 
XYZ  | Undetermined | Null   | Incorrect 
123  | Null   | Undetermined | Correct 
456  | Incorrect  | Correct  | Correct 

Мне нужно написать запрос, который насчитывает до тех атрибут оценки по всем продукты (где не равно нулю):

evaluation | correct | incorrect | undetermined 
attr_1  | 1   | 2   | 1 
attr_2  | 1   | 1   | 1 
attr_3  | 2   | 1   | 0 

Это SQL получает меня часть пути туда:

SELECT 
SUM(CASE WHEN attr_1_eval = 'Correct' then 1 else 0 END) AS correct, 
SUM(CASE WHEN attr_1_eval = 'Incorrect' then 1 else 0 END) AS incorrect, 
SUM(CASE WHEN attr_1_eval = 'Undetermined' then 1 else 0 END) AS undetermined, 
SUM(CASE WHEN attr_2_eval = 'Correct' then 1 else 0 END) AS correct, 
... 
FROM product 

Но он не группирует attr_1, attr_2.. строками с числом ошибок в столбцах (как в желаемом наборе результатов выше). Я использую Postgres, но помощь в любом вкусе SQL была бы очень желанной.

ответ

1

Можете ли вы сделать 3 профсоюза?

SELECT 
    'attr_1' AS evaluation, 
    SUM(CASE WHEN attr_1_eval = 'Correct' then 1 else 0 END) AS correct, 
    SUM(CASE WHEN attr_1_eval = 'Incorrect' then 1 else 0 END) AS incorrect, 
    SUM(CASE WHEN attr_1_eval = 'Undetermined' then 1 else 0 END) AS undetermined 
FROM product 
UNION 
SELECT 
    'attr_2' AS evaluation, 
    SUM(CASE WHEN attr_2_eval = 'Correct' then 1 else 0 END) AS correct, 
    SUM(CASE WHEN attr_2_eval = 'Incorrect' then 1 else 0 END) AS incorrect, 
    SUM(CASE WHEN attr_2_eval = 'Undetermined' then 1 else 0 END) AS undetermined 
FROM product 
UNION 
SELECT 
    'attr_3' AS evaluation, 
    SUM(CASE WHEN attr_3_eval = 'Correct' then 1 else 0 END) AS correct, 
    SUM(CASE WHEN attr_3_eval = 'Incorrect' then 1 else 0 END) AS incorrect, 
    SUM(CASE WHEN attr_3_eval = 'Undetermined' then 1 else 0 END) AS undetermined 
FROM product 

Это не самое элегантное/эффективное решение, вероятно, но он должен получить то, что вы хотите

+0

Я просто собирался опубликовать это. Единственное изменение, которое я бы сделал, - это заменить «UNION» на «UNION ALL», так как статические «attr_1», «attr_2», «attr_3», убедитесь, что записи разные. – Lamak

+0

Отлично работает в Postgres, включая «UNION All» за @Lamak. Благодаря! –

0

Это немного перебор, и я ненавижу тот факт, что она сканирует таблицу три раза, но это действительно кажется для получения желаемого результата. Мне жаль, что я не знаю PostGres, но это должно работать в Oracle:

select 
    Attribute_name, 
    Sum (correct) as Correct, 
    sum (incorrect) as Incorrect, 
    sum (undetermined) as Undetermined 
from 
    (
    select 
    'attr_1' as Attribute_Name, 
    decode (attr_1_eval, 'Correct', 1, 0) as correct, 
    decode (attr_1_eval, 'Incorrect', 1, 0) as incorrect, 
    decode (attr_1_eval, 'Undetermined', 1, 0) as undetermined 
    from product 
    union all 
    select 
    'attr_2', 
    decode (attr_2_eval, 'Correct', 1, 0), 
    decode (attr_2_eval, 'Incorrect', 1, 0), 
    decode (attr_2_eval, 'Undetermined', 1, 0) 
    from product 
    union all 
    select 
    'attr_3', 
    decode (attr_3_eval, 'Correct', 1, 0), 
    decode (attr_3_eval, 'Incorrect', 1, 0), 
    decode (attr_3_eval, 'Undetermined', 1, 0) 
    from product 
) 
group by Attribute_Name 
Смежные вопросы