我要创建一个数据透视表,如下所示:
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?
Please help, thank you
使用Coalesce函数将null值更改为0。
Coalesce ((CASE WHEN Cabang.ID_Cabang = "C001" THEN PWT END),0) AS A,
Coalesce ((CASE WHEN Cabang.ID_Cabang = "C002" THEN PWT END),0) AS B,
Coalesce ((CASE WHEN Cabang.ID_Cabang = "C003" THEN PWT END),0) AS C,
Coalesce ((CASE WHEN Cabang.ID_Cabang = "C004" THEN PWT END),0) AS D,
Coalesce ((CASE WHEN Cabang.ID_Cabang = "C005" THEN PWT END),0) AS E
更新查询:
SELECT
MONTH ,
coalesce((max(CASE WHEN Cabang.ID_Cabang = "C001" THEN PWT END)),0) AS A,
coalesce((max(CASE WHEN Cabang.ID_Cabang = "C002" THEN PWT END)),0) AS B,
coalesce((max(CASE WHEN Cabang.ID_Cabang = "C003" THEN PWT END)),0) AS C,
coalesce((max(CASE WHEN Cabang.ID_Cabang = "C004" THEN PWT END)),0) AS D,
coalesce((max(CASE WHEN Cabang.ID_Cabang = "C005" THEN PWT END)),0) 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
这比需要的更困难。
没有聚合的GROUP BY
不是正确的SQL。
SELECT month,
SUM(A),
SUM(B),
...
FROM tbl
GROUP BY month;
应该是您所需要的。这个问题似乎不需要COALESCE()
。
SUM()
(和许多其他聚合)在做算术时简单地忽略任何NULL
单元格。
另一点:COUNT('PilotStationDate')
是"错误的"。它计算字符串'PilotStationDate'不为空的次数。也许你指的是COUNT(PilotStationDate)
?
那为什么只计算时间而不计算日期呢?简单地AVG时报不行吗?