【问题标题】:Trying to to do a Sum(MAX) calculation in SQL Server尝试在 SQL Server 中进行 Sum(MAX) 计算
【发布时间】:2017-03-06 13:01:33
【问题描述】:

感谢大家提供的所有帮助,虽然这让我大开眼界,但不幸的是它并没有产生我想要的预期结果。为了更好地获得我正在寻找的帮助,我将尝试解释我想要实现的目标。

我认为主要关注的列是“IN”、“AA_Now”、“STF_Now”、“dbo.Sheet1$.LOB_name”、“dbo.Sheet1$.LifeCycleName”和“dbo.Sheet1$.AreaOfBusiness”。每个“IN”都有一个“AA_Now”和“STF_Now”。一组“IN”在“dbo.Sheet1$.LOB_name”下汇总。在“dbo.Sheet1$.LOB_name”下,我只想要汇总的“IN”组的最大值。现在“dbo.Sheet1$.LOB_name”在“dbo.Sheet1$.LifeCycleName”下汇总,我想要的是在“dbo.Sheet1$.LOB_name”下汇总的最大值的总和,以显示在“dbo.Sheet1$.LifeCycleName”的汇总。最后,“dbo.Sheet1$.LifeCycleName”汇总为“dbo.Sheet1$.AreaOfBusiness”。和以前一样,我正在寻找的是要显示的“dbo.Sheet1$.LifeCycleName”的总和。这些仅适用于“AA_Now”和“STF_Now”列 我尝试从数据透视表中执行此操作,但无济于事,并认为最好在原始数据中对其进行排序。

我正在尝试在 SQL Server 中进行 SUM(MAX) 计算,并在执行命令时出现以下错误

消息 130,级别 15,状态 1,第 6 行 无法对包含聚合或子查询的表达式执行聚合函数。

我确定错误是由两者引起的

,SUM(MAX(convert(float,replace([AA_Now], 'N/A','0')))) As [AA2_Now]

,SUM(MAX(convert(float,replace([STF_Now], 'N/A','0')))) As [STF2_Now]

但不知道如何在不导致错误的情况下重写它。

以下是完整代码。

SELECT  dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN
        ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG 
        ,dbo.CCA_Merged.regionId, dbo.CCA_Merged.sgcc       
        ,convert(float,replace([SLC_Today],'N/A','0')) As [SLC_Today]
        ,convert(float,replace([AA_Now],'N/A','0')) As [AA_Now]
        ,SUM(MAX(convert(float,replace([AA_Now],'N/A','0')))) As [AA2_Now]
        ,convert(float,replace([SLCO_Today],'N/A','0')) As [SLCO_Today]
        ,convert(float,replace([CABN_Today],'N/A','0')) As [CABN_Today]
        ,convert(float,replace([COF_Today],'N/A','0')) As [COF_Today]
        ,convert(float,replace([HT_Today],'N/A','0')) As [HT_Today]
        ,convert(float,replace(replace([CH_Today],'N/A','0'),'-','0')) As [CH_Today]
        ,convert(float,replace([SLC_Now],'N/A','0')) As [SLC_Now]
        ,convert(float,replace([SLCO_Now],'N/A','0')) As [SLCO_Now]
        ,convert(float,replace([SLC_Thirty],'N/A','0')) As [SLC_Thirty]
        ,convert(float,replace(replace([SLCO_Thirty],'N/A','0'),'-','0')) As [SLCO_Thirty]
        ,convert(float,replace([ACWT_Today],'N/A','0')) As [ACWT_Today]
        ,convert(float,replace([CQ_Now],'N/A','0')) As [CQ_Now]
        ,convert(float,replace([LCQ_Now],'N/A','0')) As [LCQ_Now]
        ,convert(float,replace([SLCH_Now],'N/A','0')) As [SLCH_Now]
        ,convert(float,replace([STF_Now],'N/A','0')) As [STF_Now]
        ,SUM(MAX(convert(float,replace([STF_Now],'N/A','0')))) As [STF2_Now]
        ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name
FROM            dbo.Sheet1$ RIGHT OUTER JOIN
                     dbo.CCA_Merged ON dbo.Sheet1$.Skill_Name = dbo.CCA_Merged.lN   
Group by ROLLUP (stf_now) ,dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN
            ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG ,dbo.CCA_Merged.regionId
            ,dbo.CCA_Merged.sgcc,AA_Now,SLC_Today,SLCO_Today,CABN_Today,COF_Today,HT_Today,CH_Today
            ,SLC_Now,SLCO_Now,SLC_Thirty,SLCO_Thirty,ACWT_Today,CQ_Now,LCQ_Now,SLCH_Now
            ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name

我对 SQL Server 比较陌生,如果有任何帮助,我将不胜感激。

提前致谢

更新了精简脚本

SELECT  dbo.CCA_Merged.lN       
    ,convert(float,replace([STF_Now],'N/A','0')) As [STF_Now]
    ,dbo.Sheet1$.LOB_name, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.AreaOfBusiness 
FROM            dbo.Sheet1$ RIGHT OUTER JOIN
                 dbo.CCA_Merged ON dbo.Sheet1$.Skill_Name = dbo.CCA_Merged.lN                   
Group by stf_now ,AA_Now,dbo.CCA_Merged.lN,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name
Order by AreaOfBusiness DESC
+----+---------+----------+----------------+------- ---------+ | LN | STF_现在 | LOB_name |生命周期名称 |业务领域 | +----+---------+----------+----------------+------- ---------+ |一个 | 46 | BSW |学士学位 |商业 | |乙| 46 | BSW |学士学位 |商业 | | C | 0 |老板 |学士学位 |商业 | | D | 112 |默沙东 |学士学位 |商业 | | E | 112 |默沙东 |学士学位 |商业 | | F | 42 |超高压 | BR |商业 | |克| 23 | BCR | BR |商业 | | H | 23 |超高压 | BR |商业 | |我 | 55 | BSW2 |学士学位 |商业 | | Ĵ | 1 | BSW2 |学士学位 |商业 | | ķ | 46 | BSW |学士学位 |商业 | |大号 | 112 |默沙东 |学士学位 |商业 | |中号 | 112 |默沙东 |学士学位 |商业 | | N | 57 | BSW |学士学位 |商业 | | ○ | 0 |老板 |学士学位 |商业 | |磷 | 38 |默沙东 |学士学位 |商业 | |问 | 38 |默沙东 |学士学位 |商业 | |右 | 19 |超高压 | BR |商业 | |小号 | 0 | BCR | BR |商业 | | T | 19 |超高压 | BR |商业 | |你 | 2 | BSW |学士学位 |商业 | |五 | 1 | BSW |学士学位 |商业 | | W | 57 | BSW |学士学位 |商业 | | X | 38 |默沙东 |学士学位 |商业 | |是 | 38 |默沙东 |学士学位 |商业 | +----+---------+----------+----------------+------- ---------+

以下是添加的 3 列中的预期结果

LOB_Name2(这是由 LN 产生的 STF_Now 的最大值)

57 BSW 0 老板 112 默沙东 42 BHV 23 BCR 55 BSW2

LifeCycleName2(这是 LOB_Name2 的 Rollup 的最大值之和)

224 学士学位 65 卧室

AreaOfBusiness2(这是 LifeCycleName2 的汇总总和)

289 商业

【问题讨论】:

  • 您确实应该添加示例数据以及您想要的结果。真的不可能弄清楚你需要什么。
  • 嗨 JamesZ 我已经添加了一些示例数据。谢谢

标签: sql-server sql-server-2014


【解决方案1】:

你不能summax,因为无论如何,如果你有相同的分组依据,那将是相同的数量。您可能需要具有不同分组依据的内部和外部部分,例如:

select
  product_group,
  sum(max_cost)
from
(
  select 
    product,
    product_group,
    max(cost) as max_cost
  from
    orders
  group by
     product_group,product
) X 
group by product_group

这个虚构的 SQL 将获取每个产品的最大成本,并将它们汇总到产品组级别。这是我能弄清楚你实际上需要sum a max的唯一方法

【讨论】:

  • 感谢您的帮助,但遗憾的是,它现在正是我想要的 - 我已经编辑了这篇文章,以便更清楚地说明我想要实现的目标。
【解决方案2】:

您遇到问题是因为您尝试执行两个嵌套聚合。如果 SUM(MAX) 实际上是您想要做的,这将大致为您提供您所追求的。

但是,正如 James 指出的那样,您需要一些按逻辑分组的方法来将它们组合在一起。

SELECT ... 
, SUM(AA2_Now_Max)
...
, SUM(STF2_Now_Max)
FROM(
SELECT  dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN
    ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG 
    ,dbo.CCA_Merged.regionId, dbo.CCA_Merged.sgcc       
    ,convert(float,replace([SLC_Today],'N/A','0')) As [SLC_Today]
    ,convert(float,replace([AA_Now],'N/A','0')) As [AA_Now]
    ,MAX(convert(float,replace([AA_Now],'N/A','0'))) As [AA2_Now_Max]
    ,convert(float,replace([SLCO_Today],'N/A','0')) As [SLCO_Today]
    ,convert(float,replace([CABN_Today],'N/A','0')) As [CABN_Today]
    ,convert(float,replace([COF_Today],'N/A','0')) As [COF_Today]
    ,convert(float,replace([HT_Today],'N/A','0')) As [HT_Today]
    ,convert(float,replace(replace([CH_Today],'N/A','0'),'-','0')) As [CH_Today]
    ,convert(float,replace([SLC_Now],'N/A','0')) As [SLC_Now]
    ,convert(float,replace([SLCO_Now],'N/A','0')) As [SLCO_Now]
    ,convert(float,replace([SLC_Thirty],'N/A','0')) As [SLC_Thirty]
    ,convert(float,replace(replace([SLCO_Thirty],'N/A','0'),'-','0')) As [SLCO_Thirty]
    ,convert(float,replace([ACWT_Today],'N/A','0')) As [ACWT_Today]
    ,convert(float,replace([CQ_Now],'N/A','0')) As [CQ_Now]
    ,convert(float,replace([LCQ_Now],'N/A','0')) As [LCQ_Now]
    ,convert(float,replace([SLCH_Now],'N/A','0')) As [SLCH_Now]
    ,convert(float,replace([STF_Now],'N/A','0')) As [STF_Now]
    ,MAX(convert(float,replace([STF_Now],'N/A','0'))) As [STF2_Now_Max]
    ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name    
FROM            dbo.Sheet1$ RIGHT OUTER JOIN
                 dbo.CCA_Merged ON dbo.Sheet1$.Skill_Name = dbo.CCA_Merged.lN   
Group by ROLLUP (stf_now) ,dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN
        ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG ,dbo.CCA_Merged.regionId
        ,dbo.CCA_Merged.sgcc,AA_Now,SLC_Today,SLCO_Today,CABN_Today,COF_Today,HT_Today,CH_Today
        ,SLC_Now,SLCO_Now,SLC_Thirty,SLCO_Thirty,ACWT_Today,CQ_Now,LCQ_Now,SLCH_Now
        ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name ) x
GROUP BY ... 

这另一个问题是类似的 - 遵循模式! SQL: SUM the MAX values of results returned

【讨论】:

  • 感谢您的帮助,但遗憾的是,它现在正是我想要的 - 我已经编辑了这篇文章,以便更清楚地说明我想要实现的目标。
【解决方案3】:

您需要添加另一个查询级别来对您的 MAX 值求和。

这个想法是在一次选择中达到 MAX,然后使用外部查询对结果求和。我在下面的示例中使用了 AVG 和 MAX,但是,可以使用任何聚合函数。

SELECT
    LocationID,
    MaxAverageSalePriceByLocation=MAX(AvgerageSalePriceByUserLocation)
FROM
(
    SELECT
        UserID,
        AvgerageSalePriceByUserLocation=AVG(SalePrice)
    FROM
        MyTable
    GROUP BY
      UserID,LocationID
)AS A 
GROUP BY
    LocationID

【讨论】:

  • 感谢您的帮助,但遗憾的是,它现在正是我想要的 - 我已经编辑了这篇文章,以便更清楚地说明我想要实现的目标。
【解决方案4】:

如果您想对所有行的 Max 值求和,请使用 OVER()

Sum(Max(CONVERT(FLOAT, Replace([STF_Now], 'N/A', '0'))))OVER() AS [STF2_Now]

如果您想对每个组的所有行 Max 值求和,请使用 OVER(Partition by)

Sum(Max(CONVERT(FLOAT, Replace([STF_Now], 'N/A', '0'))))OVER(partition by grp1,grp2,..)  AS [STF2_Now]

注意将数值数据转换为浮点数可能会导致近似问题。使用具有精度和比例的数值

【讨论】:

  • 感谢您的帮助,但不幸的是,它现在正是我想要的——我编辑了这篇文章,以使我想要实现的目标更加清晰。我喜欢 OVER() 的想法,并且将来肯定会更多地关注它。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-07-27
  • 2018-06-25
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多