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,我会在选择列表中得到无效的错误,这已经有一段时间了。如何做到这一点?单击答案左侧的复选标记按钮:-)您可以在案例中使用聚合。你也可以在一个案件上进行抗辩。这也不是真的。已经有一段时间了。如何做到这一点?单击答案左侧的复选标记按钮:-)您可以在案例中使用聚合。你也可以在一个案件上进行抗辩。这也不是真的。