如何根据从分组值求和的列计算百分比?

How to calculate percentage based off columns that summed from grouped values?

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

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

示例数据:

现有 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

期望的最终结果:

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

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

我认为您不能引用同一个 select 语句同级计算列。 您必须将所有列写入分组依据,但 summing/counting 列除外,例如 sum(column_name)、count(column_name)、avg(column_name).

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