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