Запросы рассчитывает значения полей в одной таблице - PullRequest
1 голос
/ 28 марта 2012

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

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 будет приветствоваться.

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Не могли бы вы сделать 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 голосов
/ 28 марта 2012

Это немного грубая сила, и я ненавижу тот факт, что он сканирует таблицу три раза, но, похоже, это дает желаемый результат.Извините, я не знаю 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
...