2017-10-19 2 views
0

Ich möchte von zwei die verschiedene Tabelle subtrahieren. Und das Ergebnis ist dritte Tabelle. Dies ist meine SQL-Abfrage:Cuculating Menge von zwei verschiedenen Tabelle

SELECT 
    a.ma 
    ,a.Ten 
    ,a.Dvt 
    ,ISNULL(SUM(a.Soluong),0) AS Nhap 
    ,ISNULL(SUM(b.Soluong),0) AS Xuat 
    ,(ISNULL(SUM(a.Soluong),0)-ISNULL(SUM(b.Soluong),0)) AS ton 
    ,a.Batch,a.MaKe 
FROM tbNhap a 
    INNER JOIN tbXuat b ON a.ma=b.ma and a.Batch=b.Batch 
GROUP BY 
    a.ma 
    ,a.Ten 
    ,a.Dvt 
    ,a.Batch 
    ,a.MaKe 
HAVING a.Batch LIKE '3217101711' AND a.ma LIKE '11020000000031' 
ORDER BY 
    SUBSTRING(CAST(a.Batch AS varchar(10)), 5, 2) 
    ,SUBSTRING(CAST(a.Batch AS varchar(10)), 3, 2) ASC; 

ich das gleiche Foto angezeigt werden soll. Bitte.

enter image description here

+2

Bitte fügen Sie das erwartete Ergebnis als Text/Code – Tyron78

+3

Verwenden Sie keine Bilder von Daten oder das gewünschte Ergebnis. Kopieren Sie das stattdessen in formatierten Text. Es gibt Seiten, um zu helfen, feste ASCII-Tabellen zu erstellen, wenn z.B. https://ozh.github.io/ascii-tables/ –

+0

Ihre 'have'-Klausel sollte stattdessen eine' where'-Klausel sein (verschieben Sie sie vor die 'group by'). Eine having-Klausel soll aggregierte Werte auswerten, die Sie für diese Bedingungen nicht benötigen. –

Antwort

0

Ich glaube, Sie sollten den Auftrag zwischen SUM und ISNULL ändern, sonst, wenn Sie nur eine NULL in Ihrer Summe haben, die Summe NULL sein wird, und dann wird ISNULL es in 0. Die SELECT ändern würde wie folgt aus:

SELECT 
     a.ma 
    ,a.Ten 
    ,a.Dvt 
    ,SUM(ISNULL(a.Soluong,0)) AS Nhap 
    ,SUM(ISNULL(b.Soluong,0)) AS Xuat 
    ,SUM(ISNULL(a.Soluong,0)-ISNULL(b.Soluong,0)) AS ton 
    ,a.Batch,a.MaKe 
FROM tbNhap a 
    INNER JOIN tbXuat b ON a.ma=b.ma and a.Batch=b.Batch 
GROUP BY 
    a.ma 
    ,a.Ten 
    ,a.Dvt 
    ,a.Batch 
    ,a.MaKe 
HAVING a.Batch LIKE '3217101711' AND a.ma LIKE '11020000000031' 
ORDER BY 
     SUBSTRING(CAST(a.Batch AS varchar(10)), 5, 2) 
    ,SUBSTRING(CAST(a.Batch AS varchar(10)), 3, 2) ASC; 
+0

Vielen Dank! Aber die Ergebnisse sind falsch. Es ist nicht dasselbe mir zu mögen –

0

das wird dir geben, was Sie wollen:

DECLARE @tbNhap TABLE 
(
    [id] INT 
    ,[ma] VARCHAR(24) 
    ,[Ten] VARCHAR(24) 
    ,[Dvt] VARCHAR(2) 
    ,[Soluong] INT 
    ,[Batch] VARCHAR(12) 
    ,[Make] VARCHAR(4) 
); 

DECLARE @tbXuat TABLE 
(
    [id] INT 
    ,[ma] VARCHAR(24) 
    ,[Ten] VARCHAR(24) 
    ,[Dvt] VARCHAR(2) 
    ,[Soluong] INT 
    ,[Batch] VARCHAR(12) 
    ,[Make] VARCHAR(4) 
); 

INSERT INTO @tbNhap ([id], [ma], [Ten], [Dvt], [Soluong], [Batch], [Make]) 
VALUES (1, 11020000000031, 'PTZ5S DN', 'PC', 1200, 3714101711, 'Q209') 
     ,(1, 11020000000031, 'PTZ5S DN', 'PC', 1000, 3217101711, 'R202') 
     ,(1, 11020000000031, 'PTZ5S DN', 'PC', 770, 3217101711, 'C203'); 

INSERT INTO @tbXuat ([id], [ma], [Ten], [Dvt], [Soluong], [Batch], [Make]) 
VALUES (1, 11020000000031, 'PTZ5S DN', 'PC', 500, 3217101711, 'R202') 
     ,(1, 11020000000031, 'PTZ5S DN', 'PC', 100, 3217101711, 'C203') 
     ,(1, 11020000000031, 'PTZ5S DN', 'PC', 350, 3217101711, 'C203'); 

SELECT a.ma 
     ,a.Ten 
     ,a.Dvt 
     ,SUM(ISNULL(a.Soluong,0)) AS Nhap 
     ,MAX(b.Xuat) AS Xuat 
     ,SUM(ISNULL(a.Soluong,0))- MAX(b.Xuat) AS ton 
     ,a.Batch 
     ,a.MaKe 
FROM @tbNhap a 
LEFT JOIN 
(
    SELECT ma 
      ,Ten 
      ,Dvt 
      ,Batch 
      ,make 
      ,SUM(ISNULL(Soluong,0)) AS Xuat 
    FROM @tbXuat 
    GROUP BY ma 
      ,Ten 
      ,Dvt 
      ,Batch 
      ,make 
) b 
    ON a.ma=b.ma 
    and a.Batch=b.Batch 
    and a.Make = b.make 
GROUP BY 
    a.ma 
    ,a.Ten 
    ,a.Dvt 
    ,a.Batch 
    ,a.MaKe 
HAVING a.ma LIKE '11020000000031' 
    ORDER BY 
     SUBSTRING(CAST(a.Batch AS varchar(10)), 5, 2) 
    ,SUBSTRING(CAST(a.Batch AS varchar(10)), 3, 2) ASC; 
Verwandte Themen