如何加入两个结果集以查询来自两个语句的输出

Nar*_*_CH 6 mysql

我有两个查询查询 1:

SELECT 
    e.eid, e.item as 'ITEM', SUM(s.qty) as 'TOTAL SOLD'
from
    tbl_sales s,
    tbl_matentry e
WHERE
    e.eid = s.item
GROUP By e.eid ;
Run Code Online (Sandbox Code Playgroud)

结果 1:

+---------+-------------+---------------+
|     eid |    ITEM     |  TOTAL SOLD   |
+---------+-------------+---------------+
|       1 | rupa        |             5 |
|       2 | pan america |             3 |
|       3 | John Player |            10 |
|       4 | classmate   |            11 |
|       5 | lepakshi    |            55 |
|       6 | lee         |            14 |
|       7 | puma        |             9 |
+---------+-------------+---------------+
Run Code Online (Sandbox Code Playgroud)

查询 2:

SELECT 
    e.eid, e.item as 'ITEM', SUM(s.qty) as 'TOTAL STOCK'
from
    tbl_purchases p,
    tbl_matentry e
WHERE
     e.eid = p.item
GROUP By e.eid ;
Run Code Online (Sandbox Code Playgroud)

结果 2:

+---------+-------------+--------------------+
|     eid |    ITEM     |        TOTAL STOCK |
+---------+-------------+--------------------+
|       1 | rupa        |                 41 |
|       2 | pan america |                 45 |
|       3 | John Player |                 32 |
|       4 | classmate   |                 75 |
|       5 | lepakshi    |                 56 |
|       6 | lee         |                 65 |
|       7 | puma        |                 50 |
+---------+-------------+--------------------+
Run Code Online (Sandbox Code Playgroud)

当我将两个 sql 语句组合成单个语句时,我得到的输出不正确

到目前为止,我已经尝试过这个

SELECT 
e.eid,
e.item as 'ITEM',
SUM(p.qty) as 'TOTAL STOCK',
SUM(s.qty) as ' TOATL SOLD',
(SUM(p.qty)-SUM(s.qty)) as 'BALANCE STOCK'
FROM
tbl_matentry e
    LEFT OUTER JOIN
tbl_purchases p ON p.item = e.eid
    LEFT OUTER JOIN
tbl_sales s ON s.item=e.eid
GROUP BY e.eid ORDER BY e.eid

+-----+-------------+-------+------+---------+
| eid |    ITEM     | STOCK | SOLD | BALANCE |
+-----+-------------+-------+------+---------+
|   1 | rupa        |   123 |   15 |     108 |
|   2 | pan america |    90 |    6 |      84 |
|   3 | John Player |    64 |   20 |      44 |
|   4 | classmate   |   150 |   22 |     128 |
|   5 | lepakshi    |   112 |  110 |       2 |
|   6 | lee         |   130 |   28 |     102 |
|   7 | puma        |   100 |   18 |      82 |
+-----+-------------+-------+------+---------+
Run Code Online (Sandbox Code Playgroud)

我如何得到正确的结果?我的查询中的错误/错误在哪里。请查看我的查询并帮助我获得正确的数据。

我的预期输出是

+---------+-------------+------------------+-----------------+------------------+
|     eid |    ITEM     |      TOTAL STOCK |   TOTAL SOLD    |  BALANCE STOCK   |
+---------+-------------+------------------+-----------------+------------------+
|       1 | rupa        |               41 |               5 |               36 |
|       2 | pan america |               45 |               3 |               42 |
|       3 | John Player |               32 |              10 |               22 |
|       4 | classmate   |               75 |              11 |               64 |
|       5 | lepakshi    |               56 |              55 |                1 |
|       6 | lee         |               65 |              14 |               51 |
|       7 | puma        |               50 |               9 |               41 |
+---------+-------------+------------------+-----------------+------------------+
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 14

您遇到的问题很可能来自 ,tbl_sales因为您item可以多次出现在表中。当您然后将您的表连接在一起时,您将返回qtyfromtbl_purchases中的每一行tbl_sales

您可以通过SELECT对表执行 a 来查看此行为:

SELECT e.*, p.qty purQty, s.qty salesQty
FROM tbl_matentry e
LEFT OUTER JOIN tbl_purchases p 
 ON p.item = e.eid
LEFT OUTER JOIN tbl_sales s 
  ON s.item=e.eid
ORDER BY e.eid;
Run Code Online (Sandbox Code Playgroud)

演示。您将在我的示例中看到,rupa数量出现两次,因为tbl_sales.

获得结果的一种方法是在子查询中计算TotalSoldTotalStock

select e.eid, 
  e.item,
  coalesce(p.TotalStock, 0) TotalStock,
  coalesce(s.TotalSold, 0) TotalSold,
  coalesce(p.TotalStock, 0) - coalesce(s.TotalSold, 0) BalanceStock
from tbl_matentry e
left join
(
  select item, sum(qty) TotalSold
  from tbl_sales
  group by item
) s
  on e.eid = s.item
left join
(
  select item, sum(qty) TotalStock
  from tbl_purchases
  group by item
) p
  on e.eid = p.item;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

这也可以使用单个子查询编写为tbl_sales

select e.eid, 
  e.item,
  sum(p.qty) TotalStock,
  coalesce(s.TotalSold, 0) TotalSold,
  coalesce(sum(p.qty)) - coalesce(s.TotalSold, 0) BalanceStock
from tbl_matentry e
left join tbl_purchases p
  on e.eid = p.item
left join
(
  select item, sum(qty) TotalSold
  from tbl_sales
  group by item
) s
  on e.eid = s.item
group by e.eid, e.item, TotalSold;
Run Code Online (Sandbox Code Playgroud)

参见SQL Fiddle with Demo


Iva*_*anP 5

最简单的解决方案是联合他们。至于错误,您正在加入销售和采购,有点乘以苹果和橙子(一次采购乘以 3 个销售额,反之亦然,在您的示例的第一行,rupa 123 - 15 而不是 41 - 5 )。

SELECT eid, item, SUM(tsl) AS 'TOTAL SOLD', SUM(tsk) AS  'TOTAL STOCK', SUM(tsk) - SUM(tsl) AS 'BALANCE STOCK'
FROM
(
    SELECT e.eid, e.item AS 'ITEM', SUM(s.qty) AS tsl, 0 AS tsk
    FROM tbl_sales s JOIN tbl_matentry e ON e.eid = s.item
    GROUP BY e.eid
    UNION
    SELECT e.eid, e.item AS 'ITEM', 0 AS tsl, SUM(p.qty) AS tsk
    FROM tbl_purchases p JOIN tbl_matentry e ON e.eid = p.item
    GROUP BY e.eid
) x
GROUP BY eid
Run Code Online (Sandbox Code Playgroud)