【问题标题】:Totals for Columns and Grand Total - Subquery (SQL) - each from different data sets列总计和总计 - 子查询 (SQL) - 每个来自不同的数据集
【发布时间】:2017-04-01 13:13:55
【问题描述】:

我有一个问题:

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

【问题讨论】:

  • 你的数据库是什么?
  • SQL-SRV 2012 。对不起

标签: sql sql-server sql-server-2012 null subquery


【解决方案1】:

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

【讨论】:

  • 好的,谢谢!我知道它必须在加入它们时完成,但我之前从未加入过 2 个子查询。
  • @MikeMirabelli 是的,关键点在LEFT OUTER JOIN 上:您可以选择主表并避免使用NULL 消失
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2020-06-25
  • 2015-02-09
  • 2010-10-12
相关资源
最近更新 更多