2017-10-19 109 views
0

我想從兩個不同的表中減去。 結果是第三個表格。 這是我的查詢SQL:兩個表的計算量不同

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; 

我想顯示相同的照片。請。

enter image description here

+2

請添加文本/代碼 – Tyron78

+3

不使用的圖像預期的結果數據或想要的結果。將其複製/粘貼到格式化文本中。如果需要的話,有些站點可以幫助製作固定的ASCII表格。 https://ozh.github.io/ascii-tables/ –

+0

你的'having'子句應該是'where'子句(在'group by'之前移動它)。具有條款旨在評估彙總值,這些條件不需要這些值。 –

回答

0

我想你應該改變SUM和ISNULL之間的順序,否則,如果你在你的總和只有一個NULL,總和將是NULL,然後將ISNULL其轉換爲0。SELECT會像這樣:

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

謝謝!但結果是錯誤的。我不喜歡它 –

0

這會給你想要的東西:

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;