СУММА ГРУППЫ С УЧАСТНИКОМ и CASE- Postgres - PullRequest
0 голосов
/ 31 августа 2018

Мне удалось найти очень ручную работу, но я уверен, что есть гораздо более простой метод, чем я надеюсь достичь. По сути, я пытаюсь выяснить, сколько существует погашений для клиентов, которые достигли «баллов» (продажи против их множителя) и достигли порога (2000) как одно число Пример таблицы:

ID      SALES    Multiplier    
10R46   1140.0   Two
10R46   1123.5   Two
100R91  1115.3   One
10R91   2.0      One
10M95   800.0    One
10M95   600.0    Two
10M95   33.0     Zero

Текущий код, который я использую:

SELECT ID,
        SUM(CASE WHEN Multiplier = 'Two' THEN (trunc(sales * 2)) 
        WHEN Multiplier = 'One' THEN (trunc(sales * 1))
        ELSE 0 END) as points
FROM transactions
GROUP BY ID
HAVING SUM(CASE WHEN Multiplier = 'Two' THEN (trunc(sales * 2)) 
        WHEN Multiplier = 'One' THEN (trunc(sales * 1))
        ELSE 0 END) > 2000

Из которого я помещаю результат во временную таблицу и запускаю сумму усечения сверху

SELECT SUM(trunc(points/2000))
FROM temp_table

Что дает идеальный результат (в данном случае 3), сколько существует погашений.

Итак, мой вопрос для великих умов, как мне упростить это и получить один запрос без временной таблицы?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Если вы хотите более простой запрос:

SELECT SUM(trunc(points/2000))
FROM (SELECT t.ID, SUM(TRUNC(sales * mult)) as points
      FROM transactions t JOIN
           (VALUES ('One', 1), ('Two', 2)) v(Multiplier, mult)
           ON t.Multiplier = v.Multiplier
      GROUP BY ID
      HAVING points > 2000
     ) t;

Я даже думаю, что вы можете устранить подзапрос:

SELECT SUM(SUM(TRUNC(sales * mult) / 2000) OVER ()
FROM transactions t JOIN
     (VALUES ('One', 1), ('Two', 2)) v(Multiplier, mult)
     ON t.Multiplier = v.Multiplier
GROUP BY ID
HAVING points > 2000
FETCH FIRST 1 ROW ONLY;
0 голосов
/ 31 августа 2018

В одну сторону с подзапросом.

select sum(trunc(points/2000))
from (
SELECT ID,
        SUM(CASE WHEN Multiplier = 'Two' THEN (trunc(sales * 2)) 
        WHEN Multiplier = 'One' THEN (trunc(sales * 1))
        ELSE 0 END) as points
FROM transactions
GROUP BY ID
HAVING SUM(CASE WHEN Multiplier = 'Two' THEN (trunc(sales * 2)) 
        WHEN Multiplier = 'One' THEN (trunc(sales * 1))
        ELSE 0 END) > 2000
) t

Другая опция с sum оконной функцией.

SELECT DISTINCT
        SUM(SUM(CASE WHEN Multiplier = 'Two' THEN (trunc(sales * 2)) 
                     WHEN Multiplier = 'One' THEN (trunc(sales * 1))
                ELSE 0 END
               )/2000
           ) OVER()
FROM transactions
GROUP BY ID
HAVING SUM(CASE WHEN Multiplier = 'Two' THEN (trunc(sales * 2)) 
        WHEN Multiplier = 'One' THEN (trunc(sales * 1))
        ELSE 0 END) > 2000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...