Предложение Group By меняет результаты - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть запрос типа

SELECT weeks_ind, weeks_rol, weeks_no, date,
CASE WHEN SUM(CASE WHEN rec = 'Y' THEN 1 ELSE 0 END) >= 1 THEN 'Y' ELSE 'N' END "rec",
CASE  WHEN (SUM( CASE WHEN glob is null THEN 1 WHEN glob = Id THEN 2 ELSE 0 END ))  = 3 THEN 'Many'      
WHEN (SUM( CASE WHEN glob is null THEN 1 WHEN glob = Id THEN 2 ELSE 0 END ))  = 2  THEN 'One'       
ELSE 'None' END "Type"
FROM Table WHERE Id = '12345'
AND ((visible = 'Y' AND rec = 'N') OR rec = 'Y') AND days = 100
GROUP BY date, weeks_no, weeks_ind, weeks_rol
ORDER BY date, weeks_no;

И работает хорошо, как и ожидалось, возвращает все записи.Но если я добавлю в GROUP BY "rec" как

GROUP BY date, weeks_no, weeks_ind, weeks_rol, rec 

Запрос не вернет все записи, и более того, тип неправильный.Есть идеи, почему это происходит?Я знаю, что группа только группирует записи и не влияет на количество записей.

1 Ответ

0 голосов
/ 14 февраля 2019

rec в GROUP BY - это то, что в таблице, а не то, что в вашем запросе было сокращено до «Y» / «N».

Вам необходимо ввестивнутренний запрос, что-то вроде:

SELECT weeks_ind, weeks_rol, weeks_no, date,
CASE  WHEN (SUM( CASE WHEN glob is null THEN 1 WHEN glob = Id THEN 2 ELSE 0 END ))  = 3 THEN 'Many'      
WHEN (SUM( CASE WHEN glob is null THEN 1 WHEN glob = Id THEN 2 ELSE 0 END ))  = 2  THEN 'One'       
ELSE 'None' END "Type"
from (
  SELECT weeks_ind, weeks_rol, weeks_no, date,
  CASE WHEN SUM(CASE WHEN rec = 'Y' THEN 1 ELSE 0 END) >= 1 THEN 'Y' ELSE 'N' END "rec"
  FROM Table WHERE Id = '12345'
  AND ((visible = 'Y' AND rec = 'N') OR rec = 'Y') AND days = 100
  GROUP BY date, weeks_no, weeks_ind, weeks_rol
) group by date, weeks_no, weeks_ind, weeks_rol, rec
ORDER BY date, weeks_no;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...