Разделить результат по 2 запросам - PullRequest
0 голосов
/ 03 июля 2018

Я не могу найти способ разделить результат моих 2 запросов.

Они выглядят так:

SELECT periode, cee_ref_no, SUM(somme) AS total FROM V_STAT_NAMUR 
WHERE code_ref_no IN (1, 2, 3, 4, 5, 6, 193, 215, 237, 259, 281)
AND periode BETWEEN '201401' AND '201412'
AND cee_ref_no = '961'
GROUP BY periode, cee_ref_no
ORDER BY periode;

И

SELECT periode, cee_ref_no, SUM(somme) AS total FROM V_STAT_NAMUR
WHERE code_ref_no IN (7, 8, 9, 10, 205, 227, 249, 271, 293)
AND periode BETWEEN '201401' AND '201412'
AND cee_ref_no = '961'
GROUP BY periode, cee_ref_no
ORDER BY periode;

Они выглядят довольно похоже, и оба возвращают что-то вроде этого:

 DATE  | CEE_REF_NO | TOTAL
201401 |   961      | 10713
201402 |   961      | 9593
...    |   961      | ...
201412 |   961      | 10426

Как я могу объединить их, чтобы получить что-то вроде этого:

 DATE  | CEE_REF_NO | TOTAL
201401 |   961      | Total Q1/ Total Q2
201402 |   961      | Total Q1/ Total Q2
...    |   961      | ...
201412 |   961      | Total Q1/ Total Q2

Все, что я пробовал, возвращало только одну строку или 12 строк с одинаковым результатом.

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вы можете попробовать это:

select q1.periode, q1.cee_ref_no, q1.total as Total1, q2.total as Total2, q1.total/q2.total as Division
from (
    SELECT periode, cee_ref_no, SUM(somme) AS total FROM V_STAT_NAMUR 
    WHERE code_ref_no IN (1, 2, 3, 4, 5, 6, 193, 215, 237, 259, 281)
    AND periode BETWEEN '201401' AND '201412'
    AND cee_ref_no = '961'
    GROUP BY periode, cee_ref_no
  ) q1
  join (
    SELECT periode, cee_ref_no, SUM(somme) AS total FROM V_STAT_NAMUR
    WHERE code_ref_no IN (7, 8, 9, 10, 205, 227, 249, 271, 293)
    AND periode BETWEEN '201401' AND '201412'
    AND cee_ref_no = '961'
    GROUP BY periode, cee_ref_no
  ) q2
  on q1.Periode=q2.Periode
 and q1.cee_ref_no=q2.cee_ref_no

По сути, вам нужно просто создать 2 подвыбора с вашими запросами и объединить их по периодам и cee_ref_no (если вы собираетесь включить более 1 cee_ref_no, в вашем примере есть только один). Тогда вы сможете разделить сумму от q1 и q2.

Позаботьтесь о присоединении, я не знаю, будут ли ваши данные содержать информацию обо всех месяцах в обоих запросах.

PS: запрос не проверен, написан непосредственно в редакторе.

0 голосов
/ 03 июля 2018

Попробуйте это

    Select periode, cee_ref_no, total1/total2 as Total
    From (
    SELECT periode, cee_ref_no, 
    sum(Case when code_ref_no in (1, 2, 3, 4, 5, 6, 193, 215, 237, 259, 281) Then somme else 0 end) as total1,
    sum(Case when code_ref_no in (7, 8, 9, 10, 205, 227, 249, 271, 293) Then somme else 0 end) as total2
    From my_table
WHERE code_ref_no IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 193, 205, 215, 227, 237, 249, 259, 271, 281, 293)
    AND periode BETWEEN '201401' AND '201412'
    AND cee_ref_no = '961'
    GROUP BY periode, cee_ref_no
    )
    ORDER BY periode;
0 голосов
/ 03 июля 2018

Использовать условную агрегацию:

SELECT periode, cee_ref_no,
       SUM(CASE WHEN code_ref_no IN (1, 2, 3, 4, 5, 6, 193, 215, 237, 259, 281) THEN somme ELSE 0 END) AS total_1,
       SUM(CASE WHEN code_ref_no IN (7, 8, 9, 10, 205, 227, 249, 271, 293) THEN somme ELSE 0 END) AS total_2,
       (SUM(CASE WHEN code_ref_no IN (1, 2, 3, 4, 5, 6, 193, 215, 237, 259, 281) THEN somme ELSE 0 END) /
        SUM(CASE WHEN code_ref_no IN (7, 8, 9, 10, 205, 227, 249, 271, 293) THEN sommeEND)
       ) AS ratio
FROM V_STAT_NAMUR 
WHERE  AND
      periode BETWEEN '201401' AND '201412'
GROUP BY periode, cee_ref_no
ORDER BY periode;
...