Mysql 基于日期周期的数据透视表中的计数

Mysql 基于日期周期的数据透视表中的计数,mysql,database,pivot,Mysql,Database,Pivot,我正在尝试为每月的列预订状态创建一个透视表 这是我的表和查询 select bkg.status, bkg.StartDate from tbl_booking bkg where bkg.StartDate between '2018-09-17' and '2018-10-17' order by bkg.StartDate 我想以这样的形式出现 Date Period sep | Oct | Nov Status 1 10 | 20 |

我正在尝试为每月的列预订状态创建一个透视表

这是我的表和查询

select bkg.status,
       bkg.StartDate 
from tbl_booking bkg 
where bkg.StartDate between '2018-09-17' and '2018-10-17'  
order by bkg.StartDate
我想以这样的形式出现

Date Period     sep | Oct | Nov 

Status 1         10 | 20  |30
Status 2         40 | 50  |60
我尝试了以下查询

SELECT bkg.StartDate ,bkg.status ,
count(if(bkg.StartDate between '2018-09-17' and '2018-10-17',bkg.status,0)) as 'sep',
count(if(bkg.StartDate between '2018-10-17' and '2018-11-17',bkg.status,0)) as 'Oct'
from tbl_booking bkg 
group by bkg.status
但这给了我这样的结果

如果我删除GROUPBY,它将给出e结果

,我也试过了

  SELECT bkg.status,
        count(CASE WHEN bkg.StartDate between '2018-09-17' and '2018-10-17' THEN bkg.status ELSE 0 END) AS 'sep',
        count(CASE WHEN bkg.StartDate between '2018-10-17' and '2018-11-17' THEN bkg.status ELSE 0 END) AS 'Oct'
    FROM tbl_booking bkg
GROUP BY bkg.status
比特结果似乎是一样的。

对于介于“2018-10-17”和“2018-11-17”之间的日期,没有记录,因此它应该返回0,但它为我提供了所有月份相同的所有计数值


请建议我在查询中修改更多的内容

< P> >用你的数除掉其他部分,所以当你放0的时候,它就数它,如果你使用SUM,那么它就可以了,但是对于计数,你可以跳过其他的,所以它把其他的值看作是NULL,并给你精确的计数< /P>
SELECT bkg.status,
        count(CASE WHEN bkg.StartDate between '2018-09-17' and '2018-10-17' THEN bkg.status END) AS 'sep',
        count(CASE WHEN bkg.StartDate between '2018-10-17' and '2018-11-17' THEN bkg.status END) AS 'Oct'
    FROM tbl_booking bkg 
GROUP BY bkg.status
计数(如果(bkg.StartDate介于'2018-09-17'和'2018-10-17'之间,bkg.status,0))

在您的上述代码中,即使您的
如果
条件失败,您也会返回0。现在,
COUNT(0
仍会将其计为一行,因此得到相同的行数

条件为false时,您需要返回
NULL
。它应该是这样的:

计数(如果(bkg.StartDate介于'2018-09-17'和'2018-10-17'之间,bkg.status,NULL))

如果条件失败,这将不计算行数

以下是修订后的总体查询:

SELECT bkg.StartDate ,bkg.status ,
count(if(bkg.StartDate between '2018-09-17' and '2018-10-17',bkg.status,NULL)) as 'sep',
count(if(bkg.StartDate between '2018-10-17' and '2018-11-17',bkg.status,NULL)) as 'Oct'
from tbl_booking bkg 
group by bkg.status

没有图片,谢谢。相反,请注意:认真考虑应用程序代码中数据显示的问题。好,我正在删除PICS <代码>计数(如果(BKG.2010:0917和201810-17,BKG.STATE,0)之间的开始日期)。在此,即使当IF条件失败时,您也返回0。现在,<代码>计数(0)。仍会将其计为一行。当条件为false时,您需要返回
NULL
。它应该是这样的:
count(如果(bkg.StartDate介于'2018-09-17'和'2018-10-17'之间,bkg.status,NULL))
这是您案例中的一个基本错误;可能还有其他错误。我还没有完全分析它。是的,其他部分是问题所在。是的,其他部分是罪魁祸首,这是我主要关心的问题,为什么它会计算空值。谢谢。我正在进行小测试。然后接受这个答案:)