单个查询的mysql连接案例计数

时间:2016-08-09 10:48:01

标签: mysql join count sum case

我对编程很新,现在我有问题要快速解决。仅尝试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

1 个答案:

答案 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), ...