it-swarm.com.de

So verbinden Sie zwei Ergebnismengen, die bei der Ausgabe abgefragt werden sollen, stammen aus zwei Anweisungen

Ich habe zwei Fragen Abfrage 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 ;

Ergebnis 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 |
+---------+-------------+---------------+

Abfrage 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 ;

Ergebnis 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 |
+---------+-------------+--------------------+

Wenn ich beide SQL-Anweisungen zu einer einzigen Anweisung kombiniere, erhalte ich eine falsche Ausgabe

Bisher habe ich das versucht

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 |
+-----+-------------+-------+------+---------+

Wie erhalte ich das richtige Ergebnis? Wo ist Fehler/Irrtum in meiner Abfrage. Bitte überprüfen Sie meine Abfrage und helfen Sie mir, korrekte Daten zu erhalten.

Meine erwartete Ausgabe ist

+---------+-------------+------------------+-----------------+------------------+
|     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 |
+---------+-------------+------------------+-----------------+------------------+
6
Narendar_CH

Das Problem, das Sie haben, kommt höchstwahrscheinlich vom tbl_sales, Da Ihr item mehrmals in der Tabelle erscheinen kann. Wenn Sie dann Ihre Tabellen zusammenfügen, geben Sie das qty von tbl_purchases Für jede Zeile in tbl_sales Zurück.

Sie können dieses Verhalten sehen, indem Sie ein SELECT für Ihre Tabellen ausführen:

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;

Siehe Demo . Sie werden in meinem Beispiel sehen, dass die Menge rupa zweimal erscheint, da es in tbl_sales Zwei Einträge gibt.

Eine Möglichkeit, das Ergebnis zu erhalten, besteht darin, TotalSold und TotalStock in Unterabfragen zu berechnen:

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;

Siehe SQL Fiddle mit Demo .

Dies könnte auch mit einer einzelnen Unterabfrage an tbl_sales Geschrieben werden:

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;

Siehe SQL Fiddle mit Demo

14
Taryn

Die einfachste Lösung wäre, sie zu vereinen. In Bezug auf Fehler verbinden Sie Verkäufe und Einkäufe, indem Sie Äpfel und Orangen multiplizieren (ein Einkauf wird mit 3 Verkäufen multipliziert oder umgekehrt, in der ersten Zeile Ihres Beispiels, Rupa 123 - 15 im Gegensatz zu 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
5
IvanP