2017-02-15 1 views
1

У меня есть запрос, который группирует входящие платежи в диапазоны дат (1-7 дней, 3-6 месяцев и т. Д.), И это в основном работает, как я надеялся. Тем не менее, я хочу вернуть строку, которая говорит 0, когда в диапазоне дат не ожидается доход.Запрос с оператором CASE в группе By Мне нужно создать запись, в которой нет результатов в WHEN

Группа по выглядит следующим образом:

group by 

CASE WHEN timestampdiff(day,curdate(),data.duedate) between 0 and 7 then 1 
     WHEN timestampdiff(day,curdate(),data.duedate) between 8 and 14 then 2 
     WHEN timestampdiff(day,curdate(),data.duedate) between 15 and 30 then 3 
     WHEN timestampdiff(month,curdate(),data.duedate) between 1 and 2 then 4 
     WHEN timestampdiff(month,curdate(),data.duedate) between 2 and 3 then 5 
     WHEN timestampdiff(month,curdate(),data.duedate) between 3 and 6 then 6 
     WHEN timestampdiff(month,curdate(),data.duedate) between 6 and 12 then 7 
     WHEN timestampdiff(year,curdate(),data.duedate) between 1 and 2 then 8 
     WHEN timestampdiff(year,curdate(),data.duedate) between 2 and 3 then 9 
     WHEN timestampdiff(year,curdate(),data.duedate) between 3 and 4 then 10 
     WHEN timestampdiff(year,curdate(),data.duedate) between 5 and 6 then 11 
     WHEN timestampdiff(year,curdate(),data.duedate) >= 7 then 12 

Это работает правильно в том, что он даст мне правильные суммы, но я хочу, чтобы заставить код, чтобы дать мне 0. Так что я в настоящее время получаю это:

1 300000 
5 150000 
8 300000 

То, что я на самом деле хочу это:

1 300000 
2 0 
3 0 
4 0 
5 150000 
6 0 
7 0 
8 300000 
etc. 

Это весь запрос - я попытался с помощью n IFNULL(), но не имел успеха:

select 

sum(data.principaldue+data.interestdue) as m 

from 
(select 
    la.id 
    ,rep.duedate 
    ,rep.PRINCIPALDUE 
    ,rep.INTERESTDUE 
    from repayment rep 
    join loanaccount la on la.ENCODEDKEY = rep.PARENTACCOUNTKEY 
    join loanproduct lp on lp.ENCODEDKEY = la.PRODUCTTYPEKEY 

group by 

CASE WHEN timestampdiff(day,curdate(),data.duedate) between 0 and 7 then 1 
     WHEN timestampdiff(day,curdate(),data.duedate) between 8 and 14 then 2 
     WHEN timestampdiff(day,curdate(),data.duedate) between 15 and 30 then 3 
     WHEN timestampdiff(month,curdate(),data.duedate) between 1 and 2 then 4 
     WHEN timestampdiff(month,curdate(),data.duedate) between 2 and 3 then 5 
     WHEN timestampdiff(month,curdate(),data.duedate) between 3 and 6 then 6 
     WHEN timestampdiff(month,curdate(),data.duedate) between 6 and 12 then 7 
     WHEN timestampdiff(year,curdate(),data.duedate) between 1 and 2 then 8 
     WHEN timestampdiff(year,curdate(),data.duedate) between 2 and 3 then 9 
     WHEN timestampdiff(year,curdate(),data.duedate) between 3 and 4 then 10 
     WHEN timestampdiff(year,curdate(),data.duedate) between 5 and 6 then 11 
     WHEN timestampdiff(year,curdate(),data.duedate) >= 7 then 12 

END 

Order by 

CASE WHEN timestampdiff(day,curdate(),data.duedate) between 0 and 7 then 1 
     WHEN timestampdiff(day,curdate(),data.duedate) between 8 and 14 then 2 
     WHEN timestampdiff(day,curdate(),data.duedate) between 15 and 30 then 3 
     WHEN timestampdiff(month,curdate(),data.duedate) between 1 and 2 then 4 
     WHEN timestampdiff(month,curdate(),data.duedate) between 2 and 3 then 5 
     WHEN timestampdiff(month,curdate(),data.duedate) between 3 and 6 then 6 
     WHEN timestampdiff(month,curdate(),data.duedate) between 6 and 12 then 7 
     WHEN timestampdiff(year,curdate(),data.duedate) between 1 and 2 then 8 
     WHEN timestampdiff(year,curdate(),data.duedate) between 2 and 3 then 9 
     WHEN timestampdiff(year,curdate(),data.duedate) between 3 and 4 then 10 
     WHEN timestampdiff(year,curdate(),data.duedate) between 5 and 6 then 11 
     WHEN timestampdiff(year,curdate(),data.duedate) >= 7 then 12 

END 
+0

Вы можете прямо присоединиться это с таблицей чисел? – user5226582

+0

К сожалению, у меня нет таблицы чисел в этой схеме, и у меня нет разрешения на создание таблиц. – monkeyb33f

+0

Используйте для этого переменную таблицы. – user5226582

ответ

1

Это не полный ответ, но он будет слишком большим для комментариев;

Временная таблица с номерами могут быть полезными:

MySql temporary tables:

CREATE TEMPORARY TABLE TempTable (num int); 
INSERT INTO TmpTable VALUES(1,2,3,4,5,6,7,8,9,10,11,12 ...); 

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

Допустит, у вас есть это:

results(num, val): 
1 300000 
5 150000 
8 300000 

Это должно привести к нужному выходу:

SELECT numbers.num, COALESCE(results.val, 0) as val 
FROM results RIGHT JOIN TempTable numbers on results.num = numbers.num 
WHERE numbers.num <= 12 --or other max number 

1 300000 
2 0 
... 
5 150000 
... 

Надеется, что это помогает.

Edit:

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

SELECT @row := @row + 1 as row, t.* 
FROM some_table t, (SELECT @row := 0) r 

Где some_table является любая таблица с достаточным количеством строк ,

Наверное, используйте верхний N на этом.

Другой грязный обходной путь, может быть достаточно хорошо, если вам не нужно много номеров:

SELECT 1 num 
UNION 
SELECT 2 num 
UNION 
... 

Edit:

Слегка опрятнее обходной путь:

SELECT * FROM (VALUES (1), (2), (3), ...) x(i) 
+0

Привет - спасибо за ваш ответ, но я боюсь, что у меня нет соответствующих привилегий для создания временных таблиц в схеме. – monkeyb33f

+0

Я только видел ваш комментарий после публикации этого. Будет обновлять ответ, если он может думать о чем-либо еще. – user5226582

+0

Сделано обновление. – user5226582

Смежные вопросы