2016-11-17 22 views
1

我有一個查詢:總計爲列和總計 - 子查詢(SQL) - 分別來自不同的數據集

Select * 
from 
    (Select SOH.SHIDAT_0 as 'OrdDate', SUM(SOH.ORDNOTL_0) as '1' 
    from x3v6.CICPROD.SORDER SOH 
    group by SOH.SHIDAT_0) as a, 
    (Select SDH.SHIDAT_0 as 'ShpDate', SUM(SDH.DLVNOTL_0) as '2' 
    from x3v6.CICPROD.SDELIVERY SDH 
    group by SDH.SHIDAT_0) as b, 
    (Select SIH.ACCDAT_0 as 'InvDate' , SUM(SIH.AMTNOTL_0) as '3' 
    from x3v6.CICPROD.SINVOICE SIH 
    where SIH.INVTYP_0 <> 2 
    group by SIH.ACCDAT_0) as c, 
    (Select SIH.ACCDAT_0 as 'CrdDate' , SUM(SIH.AMTNOTL_0) as '4' 
    from x3v6.CICPROD.SINVOICE SIH 
    where SIH.INVTYP_0 = 2 
    group by SIH.ACCDAT_0) as d 
where 
    (a.OrdDate = b.ShpDate) 
    and (b.ShpDate = c.InvDate) 
    and (c.InvDate = d.CrdDate) 
    and YEAR(a.OrdDate) = YEAR(GETDATE()) 
    and MONTH(a.OrdDate) = MONTH(GETDATE()) 
Order by 
    c.InvDate Desc 

哪個返回如下:

OrdDate      1      ShpDate      2     InvDate     3      CrdDate     4 
2016-11-11 00:00:00.000 186328.6800000000000 2016-11-11 00:00:00.000 144291.1400000000000 2016-11-11 00:00:00.000 131678.8600000000000 2016-11-11 00:00:00.000 1183.6800000000000 
2016-11-10 00:00:00.000 266529.9400000000000 2016-11-10 00:00:00.000 292367.0000000000000 2016-11-10 00:00:00.000 315688.8000000000000 2016-11-10 00:00:00.000 5208.0000000000000 
2016-11-08 00:00:00.000 239121.1300000000000 2016-11-08 00:00:00.000 190611.9200000000000 2016-11-08 00:00:00.000 195483.6400000000000 2016-11-08 00:00:00.000 864.0000000000000 
2016-11-04 00:00:00.000 124571.9000000000000 2016-11-04 00:00:00.000 92638.4000000000000 2016-11-04 00:00:00.000 117241.6600000000000 2016-11-04 00:00:00.000 1752.0000000000000 
2016-11-03 00:00:00.000 234202.8600000000000 2016-11-03 00:00:00.000 263060.3700000000000 2016-11-03 00:00:00.000 239889.8200000000000 2016-11-03 00:00:00.000 5208.0000000000000 
2016-11-02 00:00:00.000 194374.4000000000000 2016-11-02 00:00:00.000 233850.7600000000000 2016-11-02 00:00:00.000 305662.3000000000000 2016-11-02 00:00:00.000 42251.7900000000000 

我的問題是有些訂單合計有一個訂單日期,其中ShpDate和InvDate將爲空(尚未發貨的未清訂單)。我將如何構造這個查詢,以便顯示未結訂單以及那些已發貨和開具發票的訂單。

對不起,如果我的格式不好(我仍然習慣張貼在這個板上)。因此,像:

OrdDate      1      ShpDate      2     InvDate     3      CrdDate     4 
2016-11-14 00:00:00.000 200000.0000000000000 null     null        null     null    null      null 
2016-11-11 00:00:00.000 186328.6800000000000 2016-11-11 00:00:00.000 144291.1400000000000 2016-11-11 00:00:00.000 131678.8600000000000 2016-11-11 00:00:00.000 1183.6800000000000 
2016-11-10 00:00:00.000 266529.9400000000000 2016-11-10 00:00:00.000 292367.0000000000000 2016-11-10 00:00:00.000 315688.8000000000000 2016-11-10 00:00:00.000 5208.0000000000000 
2016-11-08 00:00:00.000 239121.1300000000000 2016-11-08 00:00:00.000 190611.9200000000000 2016-11-08 00:00:00.000 195483.6400000000000 2016-11-08 00:00:00.000 864.0000000000000 
2016-11-04 00:00:00.000 124571.9000000000000 2016-11-04 00:00:00.000 92638.4000000000000 2016-11-04 00:00:00.000 117241.6600000000000 2016-11-04 00:00:00.000 1752.0000000000000 
2016-11-03 00:00:00.000 234202.8600000000000 2016-11-03 00:00:00.000 263060.3700000000000 2016-11-03 00:00:00.000 239889.8200000000000 2016-11-03 00:00:00.000 5208.0000000000000 
2016-11-02 00:00:00.000 194374.4000000000000 2016-11-02 00:00:00.000 233850.7600000000000 2016-11-02 00:00:00.000 305662.3000000000000 2016-11-02 00:00:00.000 42251.7900000000000 
+0

什麼是你的數據庫? – Blag

+1

SQL-SRV 2012。對不起 –

回答

0

Is this what you try to do ?

SELECT * 
FROM 
    (
     SELECT SOH.SHIDAT_0 AS 'OrdDate', SUM(SOH.ORDNOTL_0) AS '1' 
     FROM x3v6.CICPROD.SORDER SOH 
     GROUP BY SOH.SHIDAT_0 
    ) AS a 
    LEFT OUTER JOIN 
     (
      SELECT SDH.SHIDAT_0 AS 'ShpDate', SUM(SDH.DLVNOTL_0) AS '2' 
      FROM x3v6.CICPROD.SDELIVERY SDH 
      GROUP BY SDH.SHIDAT_0 
     ) AS b 
     ON a.OrdDate = b.ShpDate 
    LEFT OUTER JOIN 
     (
      SELECT SIH.ACCDAT_0 AS 'InvDate' , SUM(SIH.AMTNOTL_0) AS '3' 
      FROM x3v6.CICPROD.SINVOICE SIH 
      WHERE SIH.INVTYP_0 <> 2 
      GROUP BY SIH.ACCDAT_0 
     ) AS c 
     ON b.ShpDate = c.InvDate 
    LEFT OUTER JOIN 
     (
      SELECT SIH.ACCDAT_0 AS 'CrdDate' , SUM(SIH.AMTNOTL_0) AS '4' 
      FROM x3v6.CICPROD.SINVOICE SIH 
      WHERE SIH.INVTYP_0 = 2 
      GROUP BY SIH.ACCDAT_0 
     ) AS d 
     ON c.InvDate = d.CrdDate 
WHERE 
    YEAR(a.OrdDate) = YEAR(GETDATE()) 
    AND MONTH(a.OrdDate) = MONTH(GETDATE()) 
ORDER BY c.InvDate DESC 
+0

是的,謝謝!我知道它必須在加入它們之前做,但我以前從未加入過2個子查詢。 –

+0

@MikeMirabelli是的,關鍵點在'LEFT OUTER JOIN'上:你可以選擇主表並且避免使用NULL – Blag