mysql COUNT 个子查询以及 GROUP BY YEAR

mysql Sub queries in COUNT along with GROUP BY YEAR

在找出执行此操作的最佳方法时遇到了一些困难。

这是我正在尝试做的事情:

SELECT 
YEAR(t.voucher_date) as period,
COUNT(t.id) as total_count, 
(SELECT COUNT(t2.id) FROM booking_global as t2 where t2.booking_status = 'CONFIRMED') as confirmed,
(SELECT COUNT(t3.id) FROM booking_global as t3 where t3.booking_status = 'PENDING') as pending
FROM booking_global t 
GROUP BY YEAR(t.voucher_date)

这会产生以下结果。

period total_count CONFIRMED PENDING
2014     4            5        3
2015     4            5        3

预期结果

period total_count CONFIRMED PENDING
  2014     4            3        1
  2015     4            2        2

这里我想获得相应年份的 CONFIRMED/PENDING 计数,而不是获取所有状态的计数。

我不确定如何将我的查询用作子查询并运行另一个查询结果。

您可以有一个子查询来计算每年的每个 booking_status。然后将其结果加入 table booking_global。例如,

SELECT  YEAR(t.voucher_date)  voucher_date_year,
    COUNT(t.id) total_count,
    IFNULL(calc.confirmed_count, 0) confirmed_count,
    IFNULL(calc.pending_count, 0) pending_count
FROM    booking_global t
    LEFT JOIN
    (
        SELECT YEAR(voucher_date) voucher_date_year,
            SUM(booking_status = 'CONFIRMED') confirmed_count,
            SUM(booking_status = 'PENDING') pending_count
        FROM    booking_global
        GROUP   BY YEAR(voucher_date)
    ) calc ON calc.voucher_date_year = YEAR(t.voucher_date)
GROUP   BY YEAR(t.voucher_date)

流动应该会给你正确的结果

SELECT 
YEAR(t.voucher_date) as period,
COUNT(t.id) as total_count, 
(SELECT COUNT(t2.id) FROM booking_global as t2 where t2.booking_status = 'CONFIRMED' and YEAR(t2.voucher_date) = YEAR(t.voucher_date)) as confirmed,
(SELECT COUNT(t3.id) FROM booking_global as t3 where t3.booking_status = 'PENDING'  and YEAR(t3.voucher_date) = YEAR(t.voucher_date)) as pending
FROM booking_global t 
GROUP BY YEAR(t.voucher_date)