【问题标题】:How to calculate percentage based off columns that summed from grouped values?如何根据分组值求和的列计算百分比?
【发布时间】:2021-09-23 21:00:48
【问题描述】:

我已经阅读了几个非常接近我想要完成的示例,但它们没有任何连接或多个分组和汇总的列。我正在尝试加入表格并按日期和属性分组,并对另外两个列的值求和。

我想在分组和求和发生后从这两个附加列中计算一个百分比。

样本数据:

现有 SQL 查询 - 显然这无法执行,因为我在 Group By 子句中没有 US.Vacant_Unrented_Ready 或 US.Vacant_Rented_Ready。

SELECT US.DT_Uploaded, PL.AH_Property,  SUM(CAST(US.Vacant_Unrented_Ready AS int)) AS Vacant_Unrented_Ready, SUM(CAST(US.Vacant_Unrented_Not_Ready AS int)) AS Vacant_Unrented_Not_Ready, FORMAT(CAST(US.Vacant_Unrented_Ready AS decimal) 
/ NULLIF (CAST(US.Vacant_Unrented_Not_Ready AS int) + CAST(US.Vacant_Unrented_Ready AS int), 0), 'P') AS Perc_Tot_Vac_Ready

FROM dbo.AH_Unit_Availability_Summary US LEFT OUTER JOIN dbo.AH_Property_Name_Link PL ON US.YD_Property = PL.YD_Property

GROUP BY US.DT_Uploaded, PL.AH_Property

期望的最终结果:

在此查询中完成该计算的最简单方法是什么?

【问题讨论】:

  • 请提供样本数据、期望的结果以及您想要的逻辑的清晰解释。
  • 已更新 - 希望更有用。
  • 您的查询引用了两个表。我不知道他们长什么样。这个问题还不清楚。
  • 问题对我来说似乎相当清楚 - 就像对 Laszlo 一样。他说得对,如果没有在 group 列中,就不能在同一个 select 中对计算列进行兄弟计算。

标签: sql group-by sum percentage


【解决方案1】:
SELECT DT_Uploaded, AH_Property, Vacant_Unrented_Ready, Vacant_Unrented_Not_Ready,
FORMAT(CAST(base.Vacant_Unrented_Ready AS decimal) 
/ NULLIF (CAST(base.Vacant_Unrented_Not_Ready AS int) + CAST(base.Vacant_Unrented_Ready AS int), 0), 'P') AS Perc_Tot_Vac_Ready
FROM (
  SELECT US.DT_Uploaded, PL.AH_Property,  
  SUM(CAST(US.Vacant_Unrented_Ready AS int)) AS Vacant_Unrented_Ready, 
  SUM(CAST(US.Vacant_Unrented_Not_Ready AS int)) AS Vacant_Unrented_Not_Ready, 
  FROM dbo.AH_Unit_Availability_Summary US 
  LEFT OUTER JOIN dbo.AH_Property_Name_Link PL ON US.YD_Property = PL.YD_Property
  GROUP BY US.DT_Uploaded, PL.AH_Property ) base

我认为您不能引用同一个选择语句兄弟计算列。 您必须将所有列写入分组依据,除了 sum(column_name)、count(column_name)、avg(column_name) 之类的求和/计数列。

【讨论】:

    【解决方案2】:

    Laszlo 是正确的,我不得不重新考虑这一点,最终使用了 WITH AS 语句。这使我可以按两个类别对值进行分组并计算这些值的总和。然后我选择了这些结果并计算了百分比。

    WITH A AS (SELECT        US.DT_Uploaded, PL.AH_Property, SUM(CAST(US.Vacant_Unrented_Ready AS int)) AS Vacant_Unrented_Ready, SUM(CAST(US.Vacant_Unrented_Not_Ready AS int)) AS Vacant_Unrented_Not_Ready
                         FROM            dbo.AH_Unit_Availability_Summary AS US LEFT OUTER JOIN
                                                   dbo.AH_Property_Name_Link AS PL ON US.YD_Property = PL.YD_Property
                         GROUP BY US.DT_Uploaded, PL.AH_Property)
    SELECT        DT_Uploaded, AH_Property, Vacant_Unrented_Ready, Vacant_Unrented_Not_Ready, FORMAT(CAST(Vacant_Unrented_Ready AS decimal) / NULLIF (CAST(Vacant_Unrented_Not_Ready AS int) 
                              + CAST(Vacant_Unrented_Ready AS int), 0), 'P') AS Perc_Tot_Vac_Ready
     FROM            A AS B
    

    【讨论】:

    • 请考虑将答案标记为解决方案(包括您的一次可能)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2021-03-16
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多