Farklı satırlardaki iki tablodaki verileri topla

3 Tablo vardır (SorMaster, SorDetail ve InvWarehouse):

SorMaster:

+------------+
| SalesOrder |
+------------+
|    100     |
|    101     |
|    102     |
+------------+

SorDetail:

+------------+------------+---------------+
| SalesOrder | MStockCode | MBackOrderQty |
+------------+------------+---------------+
|    100     |    PN-1    |       4       |
|    100     |    PN-2    |       9       |
|    100     |    PN-3    |       1       |
|    100     |    PN-4    |       6       |
|    101     |    PN-1    |       6       |
|    101     |    PN-3    |       2       |
|    102     |    PN-2    |      19       |
|    102     |    PN-3    |      14       |
|    102     |    PN-4    |       6       |
|    102     |    PN-5    |       4       |
+------------+------------+---------------+

InvWarehouse:

+------------+-----------+-----------+
| MStockCode | Warehouse | QtyOnHand |
+------------+-----------+-----------+
|    PN-1    |     A     |     1     |
|    PN-2    |     B     |     9     |
|    PN-3    |     A     |     0     |
|    PN-4    |     B     |     1     |
|    PN-1    |     A     |     0     |
|    PN-3    |     B     |     5     |
|    PN-2    |     A     |     9     |
|    PN-3    |     B     |     4     |
|    PN-4    |     A     |     6     |
|    PN-5    |     B     |     0     |
+------------+-----------+-----------+

Arzulanan sonuçlar:

+------------+-----------------+--------------+
| MStockCode | SumBackOrderQty | SumQtyOnHand |
+------------+-----------------+--------------+
|    PN-1    |       10        |      10      |
|    PN-2    |       28        |       1      |
|    PN-3    |       17        |       5      |
|    PN-4    |       12        |      13      |
|    PN-5    |       11        |       6      |
+------------+-----------------+--------------+

Çevrede etrafta gezinip durmadan dolaşıyordum. Görünüşe göre basit olmalı ama kafamı dolamıyor. SumBackOrderQty, açıkça SumQtyOnHand değerlendirildiğinde iki kez sayılıyor. Bu noktada select ifadesi yerine PHP'deki hesaplamaları yapıyorum ancak mümkün olan yerlerde işleri temizlemek istiyorum.

Mevcut sorgu ifadesi:

SELECT  SorDetail.MStockCode,
    SUM(SorDetail.MBackOrderQty) AS 'SumMBackOrderQty',
    SUM(InvWarehouse.QtyOnHand) AS 'SumQtyOnHand'

FROM    SysproCompanyJ.dbo.SorMaster SorMaster,
    SysproCompanyJ.dbo.SorDetail SorDetail LEFT OUTER JOIN SysproCompanyJ.dbo.InvWarehouse InvWarehouse
    ON SorDetail.MStockCode = InvWarehouse.StockCode


WHERE   SorMaster.SalesOrder = SorDetail.SalesOrder
    AND SorMaster.ActiveFlag != 'N'
    AND SorDetail.MBackOrderQty > '0'
    AND SorDetail.MPrice > '0'

GROUP BY SorDetail.MStockCode

ORDER BY    SorDetail.MStockCode ASC
1
Her tabloyu bir alt sorguda toplayın ve ardından onlara katılın.
katma yazar Barmar, kaynak
Her tabloyu bir alt sorguda toplayın ve ardından onlara katılın.
katma yazar Barmar, kaynak
Hangi RDBMS kullanıyorsunuz? MySQL, Oracle, SQL Sunucusu? Lütfen soruya uygun etiketi ekleyin.
katma yazar Barmar, kaynak
Hangi RDBMS kullanıyorsunuz? MySQL, Oracle, SQL Sunucusu? Lütfen soruya uygun etiketi ekleyin.
katma yazar Barmar, kaynak
PN-5 öğesinin SumBackOrderQty değeri 11 nedir?
katma yazar shA.t, kaynak
PN-5 öğesinin SumBackOrderQty değeri 11 nedir?
katma yazar shA.t, kaynak
PN-5 öğesinin SumBackOrderQty değeri 11 nedir?
katma yazar shA.t, kaynak
Örnek verilerden istenen sonuçları nasıl hesaplarsınız? Miktar elde etmenin bir yolunu bulamıyorum.
katma yazar Gordon Linoff, kaynak
Örnek verilerden istenen sonuçları nasıl hesaplarsınız? Miktar elde etmenin bir yolunu bulamıyorum.
katma yazar Gordon Linoff, kaynak
@GordonLinoff Sağlanan örnek verilerde bulunmayan sütunlara gönderme yapan WHERE -clause ile ilgisi olduğunu tahmin ediyorum
katma yazar fspinnenhirn, kaynak
@GordonLinoff Sağlanan örnek verilerde bulunmayan sütunlara gönderme yapan WHERE -clause ile ilgisi olduğunu tahmin ediyorum
katma yazar fspinnenhirn, kaynak
Her üç tablonun ortak bir sütunu olmadığından, bir JOIN kullanamazsınız, bu, bir SUM işleci bir alt sorguda. Seçimlerinizin ya 2 ayrı sorguyu çalıştırması ve verileri ilişkisel anahtar => değer çiftlerinde sakladığınızda ya da PHP içinde ekleme yapması gerektiğine inanıyorum veya SalesOrder 3 tablonun tümüne sütun
katma yazar DrewT, kaynak
Her üç tablonun ortak bir sütunu olmadığından, bir JOIN kullanamazsınız, bu, bir SUM işleci bir alt sorguda. Seçimlerinizin ya 2 ayrı sorguyu çalıştırması ve verileri ilişkisel anahtar => değer çiftlerinde sakladığınızda ya da PHP içinde ekleme yapması gerektiğine inanıyorum veya SalesOrder 3 tablonun tümüne sütun
katma yazar DrewT, kaynak

6 cevap

İşte bir yaklaşım:

select MStockCode, 
(select sum(MBackOrderQty) from sorDetail as T2
where T2.MStockCode = T1.MStockCode ) as SumBackOrderQty,
(select sum(QtyOnHand) from invWarehouse as T3
where T3.MStockCode = T1.MStockCode ) as SumQtyOnHand 
from 
(
select mstockcode from sorDetail
union
select mstockcode from invWarehouse
) as T1

In a fiddle here: http://sqlfiddle.com/#!9/fdaca/6

Gerçi SumQtyOnHand değerlerim sizinkilerle eşleşmiyor (@Gordon'un işaret ettiği gibi).

0
katma

İşte bir yaklaşım:

select MStockCode, 
(select sum(MBackOrderQty) from sorDetail as T2
where T2.MStockCode = T1.MStockCode ) as SumBackOrderQty,
(select sum(QtyOnHand) from invWarehouse as T3
where T3.MStockCode = T1.MStockCode ) as SumQtyOnHand 
from 
(
select mstockcode from sorDetail
union
select mstockcode from invWarehouse
) as T1

In a fiddle here: http://sqlfiddle.com/#!9/fdaca/6

Gerçi SumQtyOnHand değerlerim sizinkilerle eşleşmiyor (@Gordon'un işaret ettiği gibi).

0
katma

İşte bir yaklaşım:

select MStockCode, 
(select sum(MBackOrderQty) from sorDetail as T2
where T2.MStockCode = T1.MStockCode ) as SumBackOrderQty,
(select sum(QtyOnHand) from invWarehouse as T3
where T3.MStockCode = T1.MStockCode ) as SumQtyOnHand 
from 
(
select mstockcode from sorDetail
union
select mstockcode from invWarehouse
) as T1

In a fiddle here: http://sqlfiddle.com/#!9/fdaca/6

Gerçi SumQtyOnHand değerlerim sizinkilerle eşleşmiyor (@Gordon'un işaret ettiği gibi).

0
katma

RDBMS, veritabanı şeması, çözmeye çalıştığınız sorunun açıklaması ve yukarıda belirtilenlerle uyuşan verilerin örneklenmesi için resmin tamamını göstermeden, Barmar'ın yorumuna dayanan bir çözümün nasıl görünebileceğinin bir örneği sevmek:

SELECT SD.MStockCode, 
       SD.SumBackOrderQty, 
       IW.SumQtyOnHand
FROM (SELECT MStockCode, 
             SUM(MBackOrderQty) AS `SumBackOrderQty`
      FROM SorDetail
           JOIN SorMaster ON SorDetail.SalesOrder=SorMaster.SalesOrder
      WHERE SorMaster.ActiveFlag != 'N'
            AND SorDetail.MBackOrderQty > 0
            AND SorDetail.MPrice > 0
      GROUP BY MStockCode) AS SD
     LEFT JOIN (SELECT MStockCode, 
                       SUM(QtyOnHand) AS `SumQtyOnHand`
                FROM InvWarehouse
                GROUP BY MStockCode) AS IW ON SD.MStockCode=IW.MStockCode
ORDER BY SD.MStockCode;
0
katma

RDBMS, veritabanı şeması, çözmeye çalıştığınız sorunun açıklaması ve yukarıda belirtilenlerle uyuşan verilerin örneklenmesi için resmin tamamını göstermeden, Barmar'ın yorumuna dayanan bir çözümün nasıl görünebileceğinin bir örneği sevmek:

SELECT SD.MStockCode, 
       SD.SumBackOrderQty, 
       IW.SumQtyOnHand
FROM (SELECT MStockCode, 
             SUM(MBackOrderQty) AS `SumBackOrderQty`
      FROM SorDetail
           JOIN SorMaster ON SorDetail.SalesOrder=SorMaster.SalesOrder
      WHERE SorMaster.ActiveFlag != 'N'
            AND SorDetail.MBackOrderQty > 0
            AND SorDetail.MPrice > 0
      GROUP BY MStockCode) AS SD
     LEFT JOIN (SELECT MStockCode, 
                       SUM(QtyOnHand) AS `SumQtyOnHand`
                FROM InvWarehouse
                GROUP BY MStockCode) AS IW ON SD.MStockCode=IW.MStockCode
ORDER BY SD.MStockCode;
0
katma

RDBMS, veritabanı şeması, çözmeye çalıştığınız sorunun açıklaması ve yukarıda belirtilenlerle uyuşan verilerin örneklenmesi için resmin tamamını göstermeden, Barmar'ın yorumuna dayanan bir çözümün nasıl görünebileceğinin bir örneği sevmek:

SELECT SD.MStockCode, 
       SD.SumBackOrderQty, 
       IW.SumQtyOnHand
FROM (SELECT MStockCode, 
             SUM(MBackOrderQty) AS `SumBackOrderQty`
      FROM SorDetail
           JOIN SorMaster ON SorDetail.SalesOrder=SorMaster.SalesOrder
      WHERE SorMaster.ActiveFlag != 'N'
            AND SorDetail.MBackOrderQty > 0
            AND SorDetail.MPrice > 0
      GROUP BY MStockCode) AS SD
     LEFT JOIN (SELECT MStockCode, 
                       SUM(QtyOnHand) AS `SumQtyOnHand`
                FROM InvWarehouse
                GROUP BY MStockCode) AS IW ON SD.MStockCode=IW.MStockCode
ORDER BY SD.MStockCode;
0
katma