Как объединить два запроса, чтобы получить результат в одном запросе - PullRequest
0 голосов
/ 05 марта 2019

У меня два запроса.С 1-го числа я получаю данные за выбранный год и месяц, а со второго запроса я получаю данные за предыдущий год, т.е. за последний год

query1: SELECT sum(a.netamount) NETAMOUNT,e.CUSTOMERDESCRIPTOR,YEAR(BILLDATE) AS DATEYEAR, MONTH (BILLDATE) DATEMONTH FROM syncbill a,ecustomer e WHERE a.OUTLET=e.CUSTOMERIDENTIFIER and YEAR(BILLDATE) = '2018' AND MONTH(BILLDATE) = '09' group by outlet

query2: SELECT sum(a.netamount) NETAMOUNT,e.CUSTOMERDESCRIPTOR,YEAR(BILLDATE) AS DATEYEAR, MONTH (BILLDATE) DATEMONTH FROM syncbill a,ecustomer e WHERE a.OUTLET=e.CUSTOMERIDENTIFIER and YEAR(BILLDATE) = '2018-1' AND MONTH(BILLDATE) = '09' group by outlet

Я использую MySQL 5.5 и ставлю год-1, чтобы получить данные за предыдущий год, например, 2018-1 дает 2017 год.

Все общеемежду этими двумя запросами, кроме года в query1, год равен 2018, а в query2 год равен 2018-1 i.e 2017.

Поэтому я хочу объединить оба запроса, чтобы получить данные за один прогон.

query1 result

query2 result

, поскольку в 2017 году нет данных, поэтому они отображаются пустыми, но я хочувместо этого показывать 0.

This what I am trying to achieve

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

1 Ответ

0 голосов
/ 05 марта 2019
SELECT sum(a.netamount) NETAMOUNT
,e.CUSTOMERDESCRIPTOR
,YEAR(BILLDATE) AS DATEYEAR
, MONTH (BILLDATE) DATEMONTH 
FROM syncbill a 
INNER JOIN ecustomer e ON a.OUTLET=e.CUSTOMERIDENTIFIER  
    and YEAR(BILLDATE) = '2018' AND MONTH(BILLDATE) = '09' 
group by outlet

UNION ALL

SELECT sum(a.netamount) NETAMOUNT
,e.CUSTOMERDESCRIPTOR,
YEAR(BILLDATE) AS DATEYEAR
, MONTH (BILLDATE) DATEMONTH 
FROM syncbill a
INNER JOIN ecustomer e ON  a.OUTLET=e.CUSTOMERIDENTIFIER 
    and YEAR(BILLDATE) = '2018-1' AND MONTH(BILLDATE) = '09' 
group by outlet

Если вам нужны две разделенные строки, вы можете использовать union all

UNION ALL всегда возвращает оба результата строки

Вы также можете использовать одну группу запросов по году

    SELECT sum(a.netamount) NETAMOUNT
    ,e.CUSTOMERDESCRIPTOR
    ,YEAR(BILLDATE) AS DATEYEAR
    , MONTH (BILLDATE) DATEMONTH 
    FROM syncbill a 
    INNER JOIN ecustomer e ON a.OUTLET=e.CUSTOMERIDENTIFIER  
        and YEAR(BILLDATE) IN ('2018', '2018-1') AND MONTH(BILLDATE) = '09' 
    group by outlet, DATEYEAR, DATEMONTH 
...