如何根据从分组值求和的列计算百分比?
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
我已经阅读了几个非常接近我想要完成的示例,但它们没有任何连接或分组和求和的多列。我正在尝试按日期和 属性 加入表并分组并对另外两个列的值求和。
我想在分组和求和发生后计算这两个附加列的百分比。
示例数据:
现有 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