如果没有数据,则显示所有日期

时间:2018-01-16 02:52:03

标签: mysql sql

我想报告,但我的查询有问题。 这是我的查询

    SELECT a.Tanggal,a.IdMesin,a.PartID,b.PartName,
    SUM(a.QtyPlanning) AS Plan,SUM(IF (a.HasilProduksi <> 'Good', a.QtyProduksi, 0)) AS NG,
    SUM(IF (a.HasilProduksi = 'Good', a.QtyProduksi, 0)) AS OK
FROM
    trans_lhpdthp a
    INNER JOIN ms_partcategory b on b.PartID=a.PartID
WHERE a.Tanggal BETWEEN '2018-01-09' AND '2018-01-12'
GROUP BY a.PartID,a.IdMesin
ORDER BY b.PartName

它给我这样的结果:

|Tanggal   |IdMesin |PartID|PartName|Plan |NG |OK  |
|-------   |------  |------|--------|-----|---|----|
|2018-01-09|BS 120 A|BLXX  |BOTTOM  |5000 |500|4500|
|2018-01-09|BS 120 B|ACLA  |CLAMP   |5000 |600|4400|
|2018-01-12|BS 260 E|SMXX  |RIGHT   |1200 |0  |1200|

我希望得到这样的结果:

|Tanggal   |IdMesin |PartID|PartName|Plan |NG |OK  |
|-------   |------  |------|--------|-----|---|----|
|2018-01-09|BS 120 A|BLXX  |BOTTOM  |5000 |500|4500|
|2018-01-09|BS 120 B|ACLA  |CLAMP   |5000 |600|4400|
|2018-01-10|        |      |        |0    |0  |0   |
|2018-01-11|        |      |        |0    |0  |0   |
|2018-01-12|BS 260 E|SMXX  |RIGHT   |1200 |0  |1200|

你能帮助我,可以感激任何帮助。

2 个答案:

答案 0 :(得分:0)

您会注意到INNER JOIN与LEFT JOIN问题导致您的问题。当b中没有数据时INNER JOIN将不会显示来自a的记录。但即使你没有b中的相关记录,LEFT JOIN也会带来记录。

以下情况应该有效。

SELECT 
    a.Tanggal,
    a.IdMesin,
    a.PartID,
    b.PartName,
    SUM(a.QtyPlanning) AS Plan,
    SUM(IF (a.HasilProduksi <> 'Good', a.QtyProduksi, 0)) AS NG,
    SUM(IF (a.HasilProduksi = 'Good', a.QtyProduksi, 0)) AS OK
FROM
    trans_lhpdthp a
LEFT JOIN ms_partcategory b 
    ON b.PartID = a.PartID
WHERE a.Tanggal BETWEEN '2018-01-09' AND '2018-01-12'
GROUP BY a.PartID,a.IdMesin
ORDER BY b.PartName

答案 1 :(得分:0)

实现目标有两种方法

  1. 您在PartID上有一个INNER JOIN,您可以尝试使用自然连接 如果它有帮助。但是自然或交叉连接可能会返回所有可能的组合,因此一旦获得结果,您可以再次使用where子句对其进行过滤。
  2. 另一种方法是使用嵌套子查询而不是连接,并在你的where子句中使用包含空值的party id。