MySQL Group by 未按预期生成

问题描述 投票:0回答:1

我有几行记录需要统计每个月(有多少笔交易)。然后提出下面的查询,计算每个月的 txn

输出:

我尝试进行单行输出。但是当我按 uid 分组时,它将求和并放入 JAN2023 列(这是不正确的):

SELECT 
(IF(payment.paymentMonth='01', COUNT(payment.paymentId), 0)) as JAN2023,
(IF(payment.paymentMonth='02', COUNT(payment.paymentId), 0)) as FEB2023,
(IF(payment.paymentMonth='03', COUNT(payment.paymentId), 0)) as MAC2023,
(IF(payment.paymentMonth='04', COUNT(payment.paymentId), 0)) as APR2023,
(IF(payment.paymentMonth='05', COUNT(payment.paymentId), 0)) as MAY2023,
(IF(payment.paymentMonth='06', COUNT(payment.paymentId), 0)) as JUN2023,
(IF(payment.paymentMonth='07', COUNT(payment.paymentId), 0)) as JUL2023,
(IF(payment.paymentMonth='08', COUNT(payment.paymentId), 0)) as AUG2023,
(IF(payment.paymentMonth='09', COUNT(payment.paymentId), 0)) as SEP2023,
(IF(payment.paymentMonth='10', COUNT(payment.paymentId), 0)) as OCT2023,
(IF(payment.paymentMonth='11', COUNT(payment.paymentId), 0)) as NOV2023,
(IF(payment.paymentMonth='12', COUNT(payment.paymentId), 0)) as DEC2023,
bill.uid as uid,
payment.paymentYear as paymentYear
FROM payment
JOIN bill ON bill.billId = payment.paymentBillId
AND paymentYear='2023'
AND (paymentSubChannel='epay' OR paymentSubChannel='gpay' OR paymentSubChannel='tpay' OR paymentSubChannel='bpay')
AND payment.paymentStatus = 1
AND bill.uid = 51
GROUP BY payment.paymentMonth
mysql group-by count
1个回答
0
投票

您需要将条件逻辑放置在聚合函数中。通常这使用 case 表达式

SELECT
      COUNT(CASE WHEN payment.paymentMonth = '01' THEN 1 END) AS JAN2023
    , COUNT(CASE WHEN payment.paymentMonth = '02' THEN 1 END) AS FEB2023
    , COUNT(CASE WHEN payment.paymentMonth = '03' THEN 1 END) AS MAR2023
    , COUNT(CASE WHEN payment.paymentMonth = '04' THEN 1 END) AS APR2023
    , COUNT(CASE WHEN payment.paymentMonth = '05' THEN 1 END) AS MAY2023
    , COUNT(CASE WHEN payment.paymentMonth = '06' THEN 1 END) AS JUN2023
    , COUNT(CASE WHEN payment.paymentMonth = '07' THEN 1 END) AS JUL2023
    , COUNT(CASE WHEN payment.paymentMonth = '08' THEN 1 END) AS AUG2023
    , COUNT(CASE WHEN payment.paymentMonth = '09' THEN 1 END) AS SEP2023
    , COUNT(CASE WHEN payment.paymentMonth = '10' THEN 1 END) AS OCT2023
    , COUNT(CASE WHEN payment.paymentMonth = '11' THEN 1 END) AS NOV2023
    , COUNT(CASE WHEN payment.paymentMonth = '12' THEN 1 END) AS DEC2023
    , bill.uid AS uid
    , payment.paymentYear AS paymentYear
FROM payment
JOIN bill ON bill.billId = payment.paymentBillId
WHERE paymentYear = '2023'
    AND (
        paymentSubChannel = 'epay'
        OR paymentSubChannel = 'gpay'
        OR paymentSubChannel = 'tpay'
        OR paymentSubChannel = 'bpay'
        )
    AND payment.paymentStatus = 1
    AND bill.uid = 51
GROUP BY
      paymentYear
    , bill.uid
    
© www.soinside.com 2019 - 2024. All rights reserved.