【问题标题】:mysql join case count with single querymysql用单​​个查询连接案例计数
【发布时间】:2016-08-09 10:48:00
【问题描述】:

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

【问题讨论】:

    标签: mysql join count sum case


    【解决方案1】:

    如果有任何算术表达式的输入,例如

     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 的那个)。

    编辑 带有ON 条件且不匹配任何行的LEFT JOIN 操作将为左表中的列返回空值。这是意外空值的常见来源。 (如果您使用JOIN 代替LEFT JOIN,如果右表中的行与左表不匹配,则查询会抑制它们。)

    您可以使用这样的表达式解决这些空值问题。

    SELECT ... tbl.Triwulan_1, trgt.nilai, ROUND((tbl.Triwulan_1 / trgt.nilai * 100), 2), ...
    

    【讨论】:

    • 哦,谢谢 ollie 的建议,但你能告诉我为什么我的代码在这里“ROUND((tbl.Triwulan_1 / trgt.nilai * 100), 2) Persen_1”返回空值 cos ,它已经存在于数据库中,为什么它与未显示的表目标上的列 nilai 相同?.. 再次感谢快速响应
    • 再次感谢一千人的建议,奥利,你拯救了我的一天,没有你 THANKSSS 解决我的问题很容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2022-10-01
    相关资源
    最近更新 更多