Sql 数据未正确汇总
我创建了一个无法正确求和的查询 第一步Sql 数据未正确汇总,sql,sql-server,Sql,Sql Server,我创建了一个无法正确求和的查询 第一步 SELECT DISTINCT det.ordd_ContractItemID ,det.ordd_mn_start_date ,det.ordd_mn_end_date ,SUM(det.ordd_mn_prev_paid_amt) as Expiring --,CASE WHEN det.ordd_mn_prev_paid_amt > det.ordd_mn_billed_amt --THEN det.ordd_mn_prev_paid_amt
SELECT DISTINCT
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
,SUM(det.ordd_mn_prev_paid_amt) as Expiring
--,CASE WHEN det.ordd_mn_prev_paid_amt > det.ordd_mn_billed_amt
--THEN det.ordd_mn_prev_paid_amt - det.ordd_mn_billed_amt
--ELSE 0
--END AS Upsell
FROM ccmast_restore_20201021.dbo.lti_ord o
INNER JOIN ccmast_restore_20201021.dbo.lti_orddet det ON o.id = det.ordd_id
INNER JOIN ccmast_restore_20201021.dbo.ContractItem CI ON CI.ContractItemID = det.ordd_ContractItemID
WHERE
--det.ordd_mn_billed_amt > 0
CI.ContractItemID =327
AND det.ordd_mn_end_date BETWEEN '05/31/2020' AND '11/01/2020' --Expiring
GROUP BY
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
--,det.ordd_mn_prev_paid_amt
--,det.ordd_mn_billed_amt
ORDER BY
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
这项工作,我将得到1行数据
当我添加下一个案例陈述时,也就是我遇到问题时
第二步
SELECT
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
,SUM(det.ordd_mn_prev_paid_amt) as Expiring
,CASE WHEN det.ordd_mn_prev_paid_amt > det.ordd_mn_billed_amt
THEN det.ordd_mn_prev_paid_amt - det.ordd_mn_billed_amt
ELSE 0
END AS Upsell
FROM ccmast_restore_20201021.dbo.lti_ord o
INNER JOIN ccmast_restore_20201021.dbo.lti_orddet det ON o.id = det.ordd_id
INNER JOIN ccmast_restore_20201021.dbo.ContractItem CI ON CI.ContractItemID = det.ordd_ContractItemID
WHERE
--det.ordd_mn_billed_amt > 0
CI.ContractItemID =327
AND det.ordd_mn_end_date BETWEEN '05/31/2020' AND '11/01/2020' --Expiring
GROUP BY
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
,det.ordd_mn_prev_paid_amt
,det.ordd_mn_billed_amt
ORDER BY
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
,det.ordd_mn_prev_paid_amt
,det.ordd_mn_billed_amt
结果
ordd_contractemid ordd_mn_开始日期ordd_mn_结束日期向上销售
327 2017-10-01 00:00:00.000 2020-09-30 00:00:00.000 0.00 0.00
327 2017-10-01 00:00:00.000 2020-09-30 00:00:00.000 0.00 0.00
327 2017-10-01 00:00:00.000 2020-09-30 00:00:00.000 0.00 0.00
327 2017-10-01 00:00:00.000 2020-09-30 00:00:00.000 36331.86 0.00
我还尝试了一个IIF语句,结果相同
--,IIF(det.ordd_mn_prev_paid_amt > det.ordd_mn_billed_amt,(det.ordd_mn_prev_paid_amt - det.ordd_mn_billed_amt),0) AS Upsell
看起来你在试着评估成本和利润。尝试在内部select中进行求和,然后执行CASE语句
SELECT ordd_ContractItemID
,ordd_mn_start_date
,ordd_mn_end_date
,t.Cost
,t.Profit
,CASE
WHEN t.Cost > t.Profit THEN t.Cost - t.Profit
ELSE 0
END AS Upsell
FROM (
SELECT det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
,SUM(det.ordd_mn_prev_paid_amt) AS Cost
,SUM(det.ordd_mn_billed_amt) AS Profit
FROM dbo.lti_ord AS o
INNER JOIN dbo.lti_orddet AS det ON o.id = det.ordd_id
INNER JOIN dbo.ContractItem AS CI ON CI.ContractItemID = det.ordd_ContractItemID
WHERE 1 = 1
AND CI.ContractItemID = 327
AND det.ordd_mn_end_date BETWEEN '05/31/2020' AND '11/01/2020' --Expiring
GROUP BY
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
) AS t;
看起来你在试着评估成本和利润。尝试在内部select中进行求和,然后执行CASE语句
SELECT ordd_ContractItemID
,ordd_mn_start_date
,ordd_mn_end_date
,t.Cost
,t.Profit
,CASE
WHEN t.Cost > t.Profit THEN t.Cost - t.Profit
ELSE 0
END AS Upsell
FROM (
SELECT det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
,SUM(det.ordd_mn_prev_paid_amt) AS Cost
,SUM(det.ordd_mn_billed_amt) AS Profit
FROM dbo.lti_ord AS o
INNER JOIN dbo.lti_orddet AS det ON o.id = det.ordd_id
INNER JOIN dbo.ContractItem AS CI ON CI.ContractItemID = det.ordd_ContractItemID
WHERE 1 = 1
AND CI.ContractItemID = 327
AND det.ordd_mn_end_date BETWEEN '05/31/2020' AND '11/01/2020' --Expiring
GROUP BY
det.ordd_ContractItemID
,det.ordd_mn_start_date
,det.ordd_mn_end_date
) AS t;
分组依据必须适用于您所需的分组。其他列以某种方式进入聚合。对于总追加销售,将每条记录的追加销售相加。也许是下面这样。请注意,不需要DISTINCT,因为GROUP BY已经是DISTINCT
SELECT det.ordd_ContractItemID,
det.ordd_mn_start_date,
det.ordd_mn_end_date,
SUM(det.ordd_mn_prev_paid_amt) as [Expiring],
SUM(
CASE WHEN det.ordd_mn_prev_paid_amt > det.ordd_mn_billed_amt
THEN det.ordd_mn_prev_paid_amt - det.ordd_mn_billed_amt
ELSE 0
END
) AS [Upsell]
FROM ccmast_restore_20201021.dbo.lti_ord o
INNER JOIN ccmast_restore_20201021.dbo.lti_orddet det
ON o.id = det.ordd_id
INNER JOIN ccmast_restore_20201021.dbo.ContractItem CI
ON CI.ContractItemID = det.ordd_ContractItemID
WHERE CI.ContractItemID = 327
AND det.ordd_mn_end_date BETWEEN '05/31/2020' AND '11/01/2020' --Expiring
GROUP BY det.ordd_ContractItemID,
det.ordd_mn_start_date,
det.ordd_mn_end_date
ORDER BY det.ordd_ContractItemID,
det.ordd_mn_start_date,
det.ordd_mn_end_date
分组依据必须适用于您所需的分组。其他列以某种方式进入聚合。对于总追加销售,将每条记录的追加销售相加。也许是下面这样。请注意,不需要DISTINCT,因为GROUP BY已经是DISTINCT
SELECT det.ordd_ContractItemID,
det.ordd_mn_start_date,
det.ordd_mn_end_date,
SUM(det.ordd_mn_prev_paid_amt) as [Expiring],
SUM(
CASE WHEN det.ordd_mn_prev_paid_amt > det.ordd_mn_billed_amt
THEN det.ordd_mn_prev_paid_amt - det.ordd_mn_billed_amt
ELSE 0
END
) AS [Upsell]
FROM ccmast_restore_20201021.dbo.lti_ord o
INNER JOIN ccmast_restore_20201021.dbo.lti_orddet det
ON o.id = det.ordd_id
INNER JOIN ccmast_restore_20201021.dbo.ContractItem CI
ON CI.ContractItemID = det.ordd_ContractItemID
WHERE CI.ContractItemID = 327
AND det.ordd_mn_end_date BETWEEN '05/31/2020' AND '11/01/2020' --Expiring
GROUP BY det.ordd_ContractItemID,
det.ordd_mn_start_date,
det.ordd_mn_end_date
ORDER BY det.ordd_ContractItemID,
det.ordd_mn_start_date,
det.ordd_mn_end_date
您将在
det.ordd\u mn\u prev\u paid\u amt
上进行聚合并在其上进行分组;如果要聚合某些内容,则它不应位于分组依据中。此外,在第一个查询中,您有一个独立的
和一个分组依据
。这几乎总是意味着你的分组依据
是错误的,或者不同的
是多余的,只是增加了不必要的开销。那么问题到底是什么呢。你给了我们代码和它给出的结果,我们不知道你想要发生什么我想要的是有一行输出,而不是4行。我已经从选择中删除了Distinct。如果我从group by和order by中删除--、det.ordd_mn_prev_paid_amt--、det.ordd_mnu billed_amt--、det.ordd_mn_amt和order by,我会在选择列表中得到无效的错误,您将在det.ordd_mnu prev_paid_amt
上聚合并对其进行分组;如果要聚合某些内容,则它不应位于分组依据中。此外,在第一个查询中,您有一个独立的
和一个分组依据
。这几乎总是意味着你的分组依据
是错误的,或者不同的
是多余的,只是增加了不必要的开销。那么问题到底是什么呢。你给了我们代码和它给出的结果,我们不知道你想要发生什么我想要的是有一行输出,而不是4行。我已经从选择中删除了Distinct。如果我从group by和order by中删除--、det.ordd_mn_prev_paid_amt--、det.ordd_mn_billed_amt--、det.ordd_mn_billed_amt,我会在选择列表中得到无效的错误,这已经有一段时间了。如何做到这一点?单击答案左侧的复选标记按钮:-)您可以在案例中使用聚合。你也可以在一个案件上进行抗辩。这也不是真的。已经有一段时间了。如何做到这一点?单击答案左侧的复选标记按钮:-)您可以在案例中使用聚合。你也可以在一个案件上进行抗辩。这也不是真的。