我对编程很新,现在我有问题要快速解决。仅尝试1周并给出一些可以满足我的结果。任何人都可以帮助我,这是我的表和结果,我想表明: enter image description here
这个结果 the problem ss
我正在尝试并尝试使用此代码超过一周,但仍然没有:
enter code here SELECT idkt.id,
idkt.nama,
idkt.satuan,
trgt.nilai ,
tbl.*,
ROUND((tbl.Triwulan_1 / trgt.nilai * 100), 2) Persen_1,
ROUND((tbl.Triwulan_2 / trgt.nilai * 100), 2) Persen_2,
ROUND((tbl.Triwulan_3 / trgt.nilai * 100), 2) Persen_3,
ROUND((tbl.Triwulan_4 / trgt.nilai * 100), 2) Persen_4
FROM indikator idkt
left JOIN (
SELECT id_indikator,
YEAR(tgl) tahun,
SUM(CASE
WHEN MONTH(tgl) BETWEEN 1 AND 3 THEN
1
END) AS Triwulan_1,
SUM(CASE
WHEN MONTH(tgl) BETWEEN 4 AND 6 THEN
1
END) AS Triwulan_2,
SUM(CASE
WHEN MONTH(tgl) BETWEEN 7 AND 9 THEN
1
END) AS Triwulan_3,
SUM(CASE
WHEN MONTH(tgl) BETWEEN 10 AND 12 THEN
1
END) AS Triwulan_4
FROM msttrans
WHERE YEAR(tgl) = ".$tahun."
GROUP BY id_indikator, YEAR(tgl)) tbl
ON (idkt.id = tbl.id_indikator)
left JOIN target trgt
ON (trgt.id_indikator = idkt.id
AND YEAR(trgt.tahun) = tbl.tahun)
left JOIN (select target.nilai as fnilai from target where id_indikator is not NULL) trgt on trgt.id_indikator = idkt.id
ORDER BY idkt.id ASC
答案 0 :(得分:0)
如果算术表达式有任何输入,如
ROUND((tbl.Triwulan_1 / trgt.nilai * 100), 2)
为null,结果表达式也为null。您可能应该尝试从
更改这些类型的表达式SUM(CASE WHEN MONTH(tgl) BETWEEN 1 AND 3 THEN 1 END) AS Triwulan_1
到
SUM(CASE WHEN MONTH(tgl) BETWEEN 1 AND 3 THEN 1 ELSE 0 END) AS Triwulan_1
避免过多尝试使用空值。
此外,您应该通过逐个测试内部查询来解决问题。在连接中使用它之前,请确保它们有效(特别是包含GROUP BY的那个)。
编辑 LEFT JOIN
具有ON
条件但不匹配任何行的操作会为左表中的列返回空值。这是意外空值的常见来源。 (如果您使用JOIN
代替LEFT JOIN
,则查询会禁止右表中的行与左表匹配。)
您可以使用这样的表达式对这些空值进行故障排除。
SELECT ... tbl.Triwulan_1, trgt.nilai, ROUND((tbl.Triwulan_1 / trgt.nilai * 100), 2), ...