在MySQL数据透视表中分组

时间:2015-09-19 19:30:07

标签: mysql pivot-table

我正在创建一个像这样的数据透视表:

    MONTH   A       B       C       D       E 
     01     NULL    NULL    11.600  NULL    NULL
     01     11.600  NULL    NULL    NULL    NULL
     02     NULL    NULL    6.000   NULL    NULL
     03     NULL    NULL    14.667  NULL    NULL

当我在查询中使用Group By时,表格会发生如下变化:

   MONTH    A      B       C        D       E
   01      NULL    NULL    11.600   NULL    NULL
   02      NULL    NULL    6.000    NULL    NULL
   03      NULL    NULL    14.667   NULL    NULL

这是我正在寻找的表:

   MONTH    A      B       C        D       E
   01      11.600  NULL    11.600   NULL    NULL
   02      NULL    NULL    6.000    NULL    NULL
   03      NULL    NULL    14.667   NULL    NULL

这是我的疑问:

    SELECT 
DISTINCT MONTH , 
CASE WHEN Cabang.ID_Cabang = "C001" THEN PWT END AS A,
CASE WHEN Cabang.ID_Cabang = "C002" THEN PWT END AS B,
CASE WHEN Cabang.ID_Cabang = "C003" THEN PWT END AS C,
CASE WHEN Cabang.ID_Cabang = "C004" THEN PWT END AS D,
CASE WHEN Cabang.ID_Cabang = "C005" THEN PWT END AS E

FROM `keyperformanceindicator`

INNER JOIN pilot ON keyperformanceindicator.ID_Pilot = pilot.ID_Pilot
INNER JOIN cabang ON keyperformanceindicator.ID_Cabang = cabang.ID_Cabang
INNER JOIN 
(

  SELECT 
   DATE_FORMAT( PilotStationDate, '%m' ) AS MONTH , 
   FORMAT( SUM(`PilotWaitingTime`) / COUNT('PilotStationDate'), 3 ) AS PWT, 
   COUNT( 'PilotStationDate' ) AS jumlah

  FROM keyperformanceindicator
  INNER JOIN pilot ON keyperformanceindicator.ID_Pilot = pilot.ID_Pilot
  GROUP BY DATE_FORMAT( PilotStationDate, '%m' )

)x ON DATE_FORMAT( PilotStationDate, '%m' ) = x.Month

GROUP BY DATE_FORMAT(PilotStationDate, '%m')
ORDER BY  UNIX_TIMESTAMP( CONCAT_WS( '', PilotStationDate, ' ', PilotStationTime ) ) ASC

最后。如何将NULL更改为0?

请帮助,谢谢

1 个答案:

答案 0 :(得分:0)

这比它需要的更难。

没有一些聚合的

GROUP BY不是正确的SQL。

SELECT  month,
        SUM(A),
        SUM(B),
        ...
    FROM tbl
    GROUP BY month;

应该是您所需要的一切。这个问题似乎不需要COALESCE()

SUM()(以及许多其他聚合)在执行算术时完全忽略任何NULL个单元格。

另一点:COUNT('PilotStationDate')是"错误"。它计算文字字符串' PilotStationDate'的次数。不是空的。也许你的意思是COUNT(PilotStationDate)

但是为什么和时相提并论,但COUNT the Dates?简单地说AVG the Times是不是很有效?