【问题标题】:Summing Distinct Rows总结不同的行
【发布时间】:2018-08-21 17:39:52
【问题描述】:

我试图获得每个部分的总和,但由于某种原因,它没有给我这个代码的明确总和。它根据子查询中的记录数重复相同的部件号。我做错了什么?

Select Distinct IIF(x.omlPartID in ('10027','10028')
    ,x.omlPartID
    ,x.jmaPartID) as PartID
    , Sum(Cast(Total_Quantity as INT)) as SumTot
From (
    SELECT distinct SalesOrderLines.omlsalesorderID
        , salesorderlines.omlSalesOrderLineID
        , SalesOrderLines.omlPartID
        , JobAssemblyMaterialCombo2 .jmaPartID
        ,  (
            IIF(rtrim(SalesOrderLines.omlPartID) in ('10027','10028')
            , 1
            , JobAssemblyMaterialCombo2.jmaQuantityPerParent
            ) * SalesOrderLines.omlOrderQuantity
            ) As 'Total_Quantity'
    FROM M1_HB.dbo.SalesOrderLines SalesOrderLines 
    Left Outer Join M1_HB.dbo.SalesOrderJobLinks SalesOrderJobLinks 
        On SalesOrderLines.omlSalesOrderID = SalesOrderJobLinks.omjSalesOrderID 
            AND SalesOrderlines.omlSalesOrderLineID = SalesOrderJobLinks.omjSalesOrderLineID 
    Left Outer Join M1_HB.dbo.Jobs Jobs 
        on SalesOrderJobLinks.omjJobID = Jobs.jmpJobID 
    Left Outer Join M1_HB.dbo.JobAssemblyMaterialCombo2 JobAssemblyMaterialCombo2 
        On Jobs.jmpJobID = JobAssemblyMaterialCombo2. jmaJobID 
    Left Outer Join M1_HB.dbo.SalesOrders SalesOrders 
        On SalesOrderLines.omlSalesOrderID = SalesOrders.ompSalesOrderID 
    Left Outer Join M1_HB.dbo.Organizations Organizations 
        On SalesOrders.ompCustomerOrganizationID = Organizations.cmoOrganizationID 
    WHERE JobAssemblyMaterialCombo2 .jmaPartID in ('10027','10028') 
        or (
            SalesOrderLines.omlPartID in ('10027','10028') 
            and 
            JobAssemblyMaterialCombo2 .jmaPartID is Null
            )
) x
Group by x.omlPartID, x.jmaPartID

【问题讨论】:

  • 更新您的问题添加适当的数据样本,您的实际结果和预期结果..
  • 学习使用表别名。
  • 如果您提供的只是一个损坏的、不可读的查询,您希望人们如何帮助您?首先告诉你想要完成什么。提供样本输入、预期输出、表关系。那么也许,人们会帮助你。读这个。 stackoverflow.com/help/how-to-ask
  • 您使用的是哪个DBMS? “SQL”只是一种查询语言,而不是特定数据库产品的名称(标准 SQL 中没有iif)。请为您正在使用的数据库产品添加标签

标签: sql sum distinct


【解决方案1】:

看来你需要按 PartID 分组

  Select IIF(x.omlPartID in ('10027','10028'),x.omlPartID,x.jmaPartID) as PartID, Sum(Cast(Total_Quantity as INT)) as SumTot
  From (SELECT distinct SalesOrderLines.omlsalesorderID, salesorderlines.omlSalesOrderLineID, SalesOrderLines.omlPartID, JobAssemblyMaterialCombo2 .jmaPartID, (IIF(rtrim(SalesOrderLines.omlPartID) in ('10027','10028'),1,JobAssemblyMaterialCombo2.jmaQuantityPerParent)*SalesOrderLines.omlOrderQuantity) As 'Total_Quantity'
  FROM M1_HB.dbo.SalesOrderLines SalesOrderLines 
  Left Outer Join M1_HB.dbo.SalesOrderJobLinks SalesOrderJobLinks On SalesOrderLines.omlSalesOrderID = SalesOrderJobLinks.omjSalesOrderID AND SalesOrderlines.omlSalesOrderLineID = SalesOrderJobLinks.omjSalesOrderLineID 
  Left Outer Join M1_HB.dbo.Jobs Jobs on SalesOrderJobLinks.omjJobID = Jobs.jmpJobID 
  Left Outer Join M1_HB.dbo.JobAssemblyMaterialCombo2 JobAssemblyMaterialCombo2 On Jobs.jmpJobID = JobAssemblyMaterialCombo2 .jmaJobID 
  Left Outer Join M1_HB.dbo.SalesOrders SalesOrders On SalesOrderLines.omlSalesOrderID = SalesOrders.ompSalesOrderID 
  Left Outer Join M1_HB.dbo.Organizations Organizations On SalesOrders.ompCustomerOrganizationID = Organizations.cmoOrganizationID 
  WHERE JobAssemblyMaterialCombo2 .jmaPartID in ('10027','10028') or (SalesOrderLines.omlPartID in ('10027','10028') and JobAssemblyMaterialCombo2 .jmaPartID is Null)) x
  Group by IIF(x.omlPartID in ('10027','10028'),x.omlPartID,x.jmaPartID) 

你可以使用别名表名来减少文本,例如

  Select IIF(x.omlPartID in ('10027','10028'),x.omlPartID,x.jmaPartID) as PartID
  , Sum(Cast(Total_Quantity as INT)) as SumTot
  From (SELECT distinct sol.omlsalesorderID, salesorderlines.omlSalesOrderLineID
    , sol.omlPartID, jamc2.jmaPartID, (IIF(rtrim(sol.omlPartID) 
        in ('10027','10028')
    ,1,jamc2jmaQuantityPerParent)*sol.omlOrderQuantity) As 'Total_Quantity'
  FROM M1_HB.dbo.SalesOrderLines sol 
  Left Outer Join M1_HB.dbo.SalesOrderJobLinks sollink On sol.omlSalesOrderID = sollink.omjSalesOrderID 
        AND SalesOrderlines.omlSalesOrderLineID = sollink.omjSalesOrderLineID 
  Left Outer Join M1_HB.dbo.Jobs Jobs on sollink.omjJobID = Jobs.jmpJobID 
  Left Outer Join M1_HB.dbo.JobAssemblyMaterialCombo2 jamc2 On Jobs.jmpJobID = jamc2.jmaJobID 
  Left Outer Join M1_HB.dbo.SalesOrders so On sol.omlSalesOrderID = so.ompSalesOrderID 
  Left Outer Join M1_HB.dbo.Organizations org On so.ompCustomerOrganizationID = org.cmoOrganizationID 
  WHERE jamc2.jmaPartID in ('10027','10028') or (sol.omlPartID in ('10027','10028') and jamc2.jmaPartID is Null)) x
  Group by IIF(x.omlPartID in ('10027','10028'),x.omlPartID,x.jmaPartID) 

【讨论】:

  • 嗨 scaisEdge,感谢您的回复。
  • 嗨 scaisEdge,我正在 SQL Server Management Studio 2017 上运行查询。它告诉我“Part ID”不是有效列并突出显示“Group By PartID”。当我将其改回“按 x.omlPartID、x.jmaPartID 分组”时,它返回的结果与我最初的结果相同。我没有得到不同的 PartID 与 Sum 记录。
  • 漂亮!非常感谢您的热心帮助。
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
相关资源
最近更新 更多