Sql 将两个表中的两列和两个日期相加

Sql 将两个表中的两列和两个日期相加,sql,sql-server,Sql,Sql Server,我在一家CPG公司工作,需要创建一份报告,将上个月交付的单位与下个月的预测进行比较。简单地说,我们的预测工具偶尔会出错,这将有助于确定预测何时关闭 我的问题是我的SQL查询对预测销售额进行了正确的求和,但交付总额与我在WHERE子句中的日期无关-它是对查询能够到达的最早的交付总额进行求和 我的问题是: SELECT DelUnits.Customer, DelUnits.ObsText01, FinalFcst.SKU, FinalFcst.Customer, SUM(D

我在一家CPG公司工作,需要创建一份报告,将上个月交付的单位与下个月的预测进行比较。简单地说,我们的预测工具偶尔会出错,这将有助于确定预测何时关闭

我的问题是我的SQL查询对预测销售额进行了正确的求和,但交付总额与我在WHERE子句中的日期无关-它是对查询能够到达的最早的交付总额进行求和

我的问题是:

SELECT
    DelUnits.Customer, DelUnits.ObsText01,
    FinalFcst.SKU, FinalFcst.Customer,
    SUM(DelUnits.Value) AS TotalDelivered,
    SUM(FinalFcst.FinalFcst) AS ForecastSales
FROM 
    DelUnits
LEFT JOIN 
    FinalFcst ON DelUnits.Customer = FinalFcst.Customer
WHERE 
    (FinalFcst.DT >= '2018-01-01' and FinalFcst.DT <= '2018-01-31')
    AND (DelUnits.Date >= '2017-12-01' and DelUnits.Date <= '2017-12-31')
    AND DelUnits.ObsText01 = '10_LB'
    AND FinalFcst.SKU = '10_LB'
GROUP BY 
    DelUnits.Customer, DelUnits.ObsText01, FinalFcst.SKU, FinalFcst.Customer
同样,对于最终预测,该查询似乎工作正常,它将预测值加总在1/1/18-1/31/18之间,但将客户的整个交付历史相加。我不明白为什么它不会对2017年12月1日-2017年12月31日的交付历史进行汇总


谢谢你的帮助

据推测,FinalFcst只有一行。因此,要么将其包含在GROUP BY子句中,要么使用MAX而不是SUM:


据推测,FinalFcst只有一行。因此,要么将其包含在GROUP BY子句中,要么使用MAX而不是SUM:


也许您可以尝试创建一个临时表来计算交付历史记录。我不确定SQL Server的措辞,但大致如下:

WITH DEL_HIST AS
(SELECT DelUnits.Customer,
DelUnits.ObsText01,
sum(DelUnits.Value) as TotalDelivered,
FROM DelUnits
Where(DelUnits.Date >= '2017-12-01' and DelUnits.Date <= '2017-12-31')
and DelUnits.ObsText01 = '10_LB'
Group By DelUnits.Customer, DelUnits.ObsText01)
SELECT
DEL_HIST.Customer,
DEL_HIST.ObsText01,
FinalFcst.SKU,
FinalFcst.Customer,
DEL_HIST.TotalDelivered,
sum(FinalFcst.FinalFcst) as ForecastSales
FROM DEL_HIST
left join FinalFcst ON DelUnits.Customer = FinalFcst.Customer
Where (FinalFcst.DT >= '2018-01-01' and FinalFcst.DT <= '2018-01-31')
and FinalFcst.SKU = '10_LB'
Group By DelUnits.Customer, DelUnits.ObsText01, FinalFcst.SKU, FinalFcst.Customer

也许您可以尝试创建一个临时表来计算交付历史记录。我不确定SQL Server的措辞,但大致如下:

WITH DEL_HIST AS
(SELECT DelUnits.Customer,
DelUnits.ObsText01,
sum(DelUnits.Value) as TotalDelivered,
FROM DelUnits
Where(DelUnits.Date >= '2017-12-01' and DelUnits.Date <= '2017-12-31')
and DelUnits.ObsText01 = '10_LB'
Group By DelUnits.Customer, DelUnits.ObsText01)
SELECT
DEL_HIST.Customer,
DEL_HIST.ObsText01,
FinalFcst.SKU,
FinalFcst.Customer,
DEL_HIST.TotalDelivered,
sum(FinalFcst.FinalFcst) as ForecastSales
FROM DEL_HIST
left join FinalFcst ON DelUnits.Customer = FinalFcst.Customer
Where (FinalFcst.DT >= '2018-01-01' and FinalFcst.DT <= '2018-01-31')
and FinalFcst.SKU = '10_LB'
Group By DelUnits.Customer, DelUnits.ObsText01, FinalFcst.SKU, FinalFcst.Customer

表之间存在多对多关系。最终,您需要先对一个表求和,然后再连接到另一个表以创建一对多关系,否则最终会复制记录

我最喜欢的方法是派生表:

SELECT C.Customer, 
       C.ObsText01,
       FC.SKU,
       C.TotalDelivered,
       SUM(FC.FinalFcst) ForecastSales
FROM (SELECT SUM(Value) TotalDelivered, Customer, ObsText01
      FROM DelUnits
      WHERE Date >= '2017-12-01' AND Date <= '2017-12-31'
      AND ObsText01 = '10_LB'
      GROUP BY Customer) C
LEFT JOIN FinalFcst FC ON C.Customer = FC.Customer
                      AND FC.DT >= '2018-01-01' 
                      AND FC.DT <= '2018-01-31'
                      AND FC.SKU = '10_LB'
GROUP BY C.Customer, C.ObsText01, FC.SKU, C.TotalDelivered

有两件事:将预测表过滤器添加到连接谓词中,因为在WHERE中使用这些过滤器将从左连接中创建一个内部连接。还从选择和组中删除了FC.Customer,因为它与C.Customer是冗余的。

表之间存在多对多关系。最终,您需要先对一个表求和,然后再连接到另一个表以创建一对多关系,否则最终会复制记录

我最喜欢的方法是派生表:

SELECT C.Customer, 
       C.ObsText01,
       FC.SKU,
       C.TotalDelivered,
       SUM(FC.FinalFcst) ForecastSales
FROM (SELECT SUM(Value) TotalDelivered, Customer, ObsText01
      FROM DelUnits
      WHERE Date >= '2017-12-01' AND Date <= '2017-12-31'
      AND ObsText01 = '10_LB'
      GROUP BY Customer) C
LEFT JOIN FinalFcst FC ON C.Customer = FC.Customer
                      AND FC.DT >= '2018-01-01' 
                      AND FC.DT <= '2018-01-31'
                      AND FC.SKU = '10_LB'
GROUP BY C.Customer, C.ObsText01, FC.SKU, C.TotalDelivered

有两件事:将预测表过滤器添加到连接谓词中,因为在WHERE中使用这些过滤器将从左连接中创建一个内部连接。还从选择和组中删除了FC.Customer,因为它与C.Customer是冗余的。

实现这一点的一种方法是在两个不同的查询中计算TotalDelivered和ForecastSales,然后将它们连接在一起

试试这个:

SELECT DelUnits.customer, 
       DelUnits.obstext01, 
       FinalFcst.sku, 
       FinalFcst.customer, 
       totaldelivered, 
       forecastsales 
FROM   (SELECT customer, 
               obstext01, 
               Sum(value) AS TotalDelivered 
        FROM   delunits 
        WHERE  date >= '2017-12-01' 
               AND date <= '2017-12-31'  
               AND obstext01 = '10_LB' 
        GROUP  BY customer, 
                  obstext01) DelUnits 
LEFT JOIN (SELECT customer, 
                    sku, 
                    Sum(finalfcst) AS ForecastSales 
            FROM   finalfcst 
            WHERE  dt >= '2018-01-01' 
                   AND dt <= '2018-01-31' 
                   AND sku = '10_LB' 
            GROUP  BY customer, 
                    sku) FinalFcst  ON DelUnits.customer = FinalFcst.customer 

实现这一点的一种方法是在两个不同的查询中计算TotalDelivered和ForecastSales,然后将它们连接在一起

试试这个:

SELECT DelUnits.customer, 
       DelUnits.obstext01, 
       FinalFcst.sku, 
       FinalFcst.customer, 
       totaldelivered, 
       forecastsales 
FROM   (SELECT customer, 
               obstext01, 
               Sum(value) AS TotalDelivered 
        FROM   delunits 
        WHERE  date >= '2017-12-01' 
               AND date <= '2017-12-31'  
               AND obstext01 = '10_LB' 
        GROUP  BY customer, 
                  obstext01) DelUnits 
LEFT JOIN (SELECT customer, 
                    sku, 
                    Sum(finalfcst) AS ForecastSales 
            FROM   finalfcst 
            WHERE  dt >= '2018-01-01' 
                   AND dt <= '2018-01-31' 
                   AND sku = '10_LB' 
            GROUP  BY customer, 
                    sku) FinalFcst  ON DelUnits.customer = FinalFcst.customer 

查询似乎正确,如果将sumFinalFcst.FinalFcst删除为ForecastSales,那么总数正确吗?请添加一些示例data@KashifQureshi谢谢你的建议。请参阅编辑后的文章。仍在学习问题中需要包括的内容:@TheOni如果我删除where子句中的该行和FinalFcst行,它仍然不能正确求和TotalDelivered。在加入查询之前,需要对两边求和,如果将sumFinalFcst.FinalFcst删除为ForecastSales,那么总数是否正确?请添加一些示例data@KashifQureshi谢谢你的建议。请参阅编辑后的文章。仍在学习问题中需要包括的内容:@TheOni如果我删除where子句中的该行和FinalFcst行,它仍然不能正确求和TotalDelivered。在加入FinalFcst表之前,您需要在两侧求和实际上每个客户都有多行。。。每个日期一行,包括该日期的预测。所以我需要总和,对吗?MAX会给我表格中每个客户的最大预测值吗?FinalFcst表格中每个客户都有多行。。。每个日期一行,包括该日期的预测。所以我需要总和,对吗?MAX只会给我表中每个客户的最大预测?CTE不是临时表。CTE不是临时表。您还需要加入obstext01=sku您还需要加入obstext01=sku