Конвертировать общую сумму в проценты - PullRequest
1 голос
/ 26 апреля 2019

Я хочу конвертировать сумму в процентах. При добавлении это приведет к 100%. Я уже сгруппировал его по замечаниям и уже получил сумму по моему запросу. Но это все еще в числе.

Это мой запрос

SELECT
    CASE
        WHEN A.district = B.district THEN 'Delivered from store in same district'
        WHEN A.city = B.city THEN 'Delivered from store in same city'
        WHEN A.province = B.province THEN 'Delivered from store in same province'
        ELSE 'Not delivered from nearest store'
    END AS 'REMARK',
    SUM(CASE
        WHEN YEAR(T1.create_time) = '2019' AND MONTH(T1.create_time) = '01' THEN 1
        ELSE 0
    END) AS 'Jan-19',
    SUM(CASE
        WHEN YEAR(T1.create_time) = '2019' AND MONTH(T1.create_time) = '02' THEN 1
        ELSE 0
    END) AS 'Feb-19',
    SUM(CASE
        WHEN YEAR(T1.create_time) = '2019' AND MONTH(T1.create_time) = '03' THEN 1
        ELSE 0
    END) AS 'Mar-19', 
    SUM(CASE
        WHEN YEAR(T1.create_time) = '2019' AND MONTH(T1.create_time) = '04' THEN 1
        ELSE 0
    END) AS 'Apr-19'
FROM 
    au_store_add A
INNER JOIN
    (SELECT
        A.id,
        A.code,
        A.create_time,
        A.plat_create_time,
        A.appoint_stcode,
        A.status
        FROM deli_order A
        WHERE A.appoint_stcode IS NOT NULL
    UNION
        SELECT
        B.id,
        B.code,
        B.create_time,
        B.plat_create_time,
        B.destination_code,
        B.status
        FROM deli_order B
        WHERE B.destination_code IS NOT NULL) T1 ON T1.appoint_stcode = A.store_code
INNER JOIN
    deli_order_delivery B ON B.order_id = T1.id
WHERE 
    YEAR(T1.plat_create_time)='2019' and T1.status = 6 and (month(T1.plat_create_time) in (1,2,3,4))
GROUP BY
    CASE
        WHEN A.district = B.district THEN 'Delivered from store in same district'
        WHEN A.city = B.city THEN 'Delivered from store in same city'
        WHEN A.province = B.province THEN 'Delivered from store in same province'
        ELSE 'Not delivered from nearest store'
    END

И результат такой:

REMARK                                | Jan-19| Feb-19| Mar-19| Apr-19|
-----------------------------------------------------------------------
Delivered from store in same city        252      198    308      283
Delivered from store in same district    114      110    163      138 
Delivered from store in same province    1135     976    1387    1208
Not delivered from nearest store         3046     2518   3189    3123

Мне нужно генерировать что-то подобное для каждого месяца (без 'Grand Total')

REMARK                                | Jan-19| 
-----------------------------------------------
Delivered from store in same city        5.5%     
Delivered from store in same district    2.5%     
Delivered from store in same province    25%     
Not delivered from nearest store         67%    
Grand Total                              4547  (100%)   

Что мне добавить в мой запрос?

1 Ответ

0 голосов
/ 26 апреля 2019

Учитывая, что вы используете MySQL 8+, тогда COUNT() в качестве аналитической функции должно быть доступно для использования. Это пригодится здесь:

SELECT
    CASE
        WHEN A.district = B.district THEN 'Delivered from store in same district'
        WHEN A.city = B.city THEN 'Delivered from store in same city'
        WHEN A.province = B.province THEN 'Delivered from store in same province'
        ELSE 'Not delivered from nearest store'
    END AS REMARK,
    100.0 * COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-01' THEN 1 END)
        / COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-01'
                     THEN 1 END) OVER () `Jan-19`,
    100.0 * COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-02' THEN 1 END)
        / COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-02'
                     THEN 1 END) OVER () `Feb-19`,
    100.0 * COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-03' THEN 1 END)
        / COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-03'
                     THEN 1 END) OVER () `Mar-19`,
    100.0 * COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-04' THEN 1 END)
        / COUNT(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = '2019-04'
                     THEN 1 END) OVER () `Apr-19`
FROM 
    au_store_add A
...

Я использовал DATE_FORMAT выше, чтобы сделать проверку года и месяца немного менее многословной. Я также использовал COUNT вместо SUM, что позволяет нам использовать несколько более короткое условное выражение.

...