【问题标题】:How to merge two queries into a subqueries如何将两个查询合并为一个子查询
【发布时间】:2020-03-16 13:52:18
【问题描述】:

我有这样的数据库http://sqlfiddle.com/#!9/e52c43

第一个查询是:

SELECT m.tanggal, sum(mi.qty) as totalMuatan, mi.idPlastik 
FROM tblMuatan m
LEFT JOIN tblMuatanIsi mi ON m.idMuatan = mi.idMuatan
WHERE m.tanggal='2020-03-15'
GROUP BY mi.idPlastik

结果是:

tanggal       totalMuatan    idPlastik
2020-03-15    85             1
2020-03-15    10             2

第二个查询是:

SELECT s.tanggal, sum(si.qty) as totalStok, si.idPlastik

FROM tblStok s

LEFT JOIN tblStokIsi si ON s.idStok = si.idStok
WHERE s.tanggal = '2020-03-15'
GROUP BY si.idPlastik

结果是:

tanggal       totalStok    idPlastik
2020-03-15    100          1
2020-03-15    200          2

我想将这 2 个查询合并为带有子查询的单个查询

tanggal       totalStok     totalMuatan     netTotal    idPlastik
2020-03-15    100           85              15          1
2020-03-15    200           10              190         2

上面例子中的子查询怎么做?感谢您的支持

【问题讨论】:

  • UNION ALL,GROUP BY tanggal。
  • 您是否只想匹配 "idPlastik: 从两个表中显示?如果是,则内部联接将起作用。如果否,则您可能需要使用左联接。

标签: mysql sql subquery


【解决方案1】:

最好使用COALESCE,因为您将LEFT JOIN 用于计算SUM 的表,以避免具有NULL 值的记录没有结果。

select m.tanggal, t.totalStok, sum(mi.qty) as totalMuatan, coalesce(t.totalStok,0)-coalesce(sum(mi.qty),0) as netTotal, mi.idPlastik 
from tblMuatan m
LEFT JOIN tblMuatanIsi mi ON m.idMuatan = mi.idMuatan
JOIN (SELECT s.tanggal, sum(si.qty) as totalStok, si.idPlastik 
FROM tblStok s 
LEFT JOIN tblStokIsi si ON s.idStok = si.idStok 
WHERE s.tanggal='2020-03-15'
GROUP BY s.tanggal,si.idPlastik) t on m.tanggal=t.tanggal and mi.idPlastik = t.idPlastik 
group by  m.tanggal, t.totalStok,mi.idPlastik 

【讨论】:

  • 我尝试了您的查询,但它返回未知列 mi.idPlastik。我已将 tblMuatanIsi 左连接移至 tblMuatan 上方,但仍然报错。请帮我解决这个问题。谢谢!
  • @Goldplate 那是我的错。您实际上不需要加入 idPlastik。我更正了它,它现在应该可以工作了
  • 返回不正确sqlfiddle.com/#!9/e52c43/50 如下所示。
  • 现在可以使用了。需要了解关系。
  • 感谢您的回答,抱歉迟到了。像魅力一样工作!
【解决方案2】:

请尝试..

SELECT T1.tanggal, T2.totalStok, T1.totalMuatan, (T2.totalStok - T1.totalMuatan), T1.idPlastik
FROM
(SELECT m.tanggal, sum(mi.qty) as totalMuatan, mi.idPlastik 
FROM tblMuatan m
LEFT JOIN tblMuatanIsi mi ON m.idMuatan = mi.idMuatan
WHERE m.tanggal='2020-03-15'
GROUP BY mi.idPlastik) 
as T1,
(SELECT s.tanggal, sum(si.qty) as totalStok, si.idPlastik
FROM tblStok s
LEFT JOIN tblStokIsi si ON s.idStok = si.idStok
WHERE s.tanggal = '2020-03-15'
GROUP BY si.idPlastik)
as T2
WHERE
T1.tanggal = T2.tanggal;

【讨论】:

  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 请注意,如果两个查询之一没有返回任何内容,则此解决方案不会返回现有数据。
  • @jarlh 请提供链接,以便我可以关注您提到的现代加入。任何研究或博客链接。谢谢!
  • @jarlh 抱歉!又打扰你了。请向我提供您所提到的加入的具体信息。这个 wiki 太大了,而且已经得到了所有的连接!再次感谢!
  • 只需使用select ... from t1 JOIN t2 ON t1.c = t2.d,而不是select ... from t1, t2 where t1.c = t2.d
【解决方案3】:
SELECT a.tanggal, 
       b.totalstok, 
       a.totalmuatan, 
       ( totalstok - totalmuatan ) netTotal, 
       a.idplastik 
FROM   (SELECT convert(varchar, m.tanggal, 23) tanggal, 
               Sum(mi.qty) AS totalMuatan, 
               mi.idplastik 
        FROM   #tblmuatan m 
               LEFT JOIN #tblmuatanisi mi 
                      ON m.idmuatan = mi.idmuatan 
        WHERE  m.tanggal = 1 
        GROUP  BY mi.idplastik, 
                  convert(varchar, m.tanggal, 23)) a 
       JOIN (SELECT convert(varchar, s.tanggal, 23) tanggal, 
                    Sum(si.qty) AS totalStok, 
                    si.idplastik 
             FROM   #tblstok s 
                    LEFT JOIN #tblstokisi si 
                           ON s.idstok = si.idstok 
             WHERE  s.tanggal = 1 
             GROUP  BY si.idplastik, 
                       convert(varchar, s.tanggal, 23)) b 
         ON a.idplastik = b.idplastik 

【讨论】:

  • 为什么这个查询返回语法错误?请帮我解决这个问题。谢谢!
  • 感谢您的编辑。但是,如果我有 3 行 tblPlastik,则不会显示第三个数据,而不是给出 '0' 或 NULL 返回。如何解决?谢谢!
  • 感谢您的回答。按预期工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2021-09-28
相关资源
最近更新 更多