我的查询类似于上一个问题的答案:
WITH CteTally(N) AS(
SELECT N FROM(VALUES
(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)
)t(N)
),
CteDates(YearPart, MonthPart, YearName, MonthName) AS(
SELECT
DATEPART(YEAR, DATEADD(MONTH, t.N - 1, DATEADD(YEAR, a.Y - 1900, 0))),
DATEPART(MONTH, DATEADD(MONTH, t.N - 1, DATEADD(YEAR, a.Y - 1900, 0))),
DATENAME(YEAR, DATEADD(MONTH, t.N - 1, DATEADD(YEAR, a.Y - 1900, 0))),
DATENAME(MONTH, DATEADD(MONTH, t.N - 1, DATEADD(YEAR, a.Y - 1900, 0)))
FROM(
SELECT DISTINCT DATEPART(YEAR, call_date) AS Y
FROM rm_report
)a
CROSS JOIN CteTally t
)
SELECT
COUNT(r.call_date) AS Events,
d.YearPart,
d.MonthPart,
d.YearName,
d.MonthName
FROM CteDates d
LEFT JOIN rm_report r
ON d.YearPart = DATEPART(YEAR, r.call_date)
AND d.YearName= DATENAME(YEAR, r.call_date)
AND d.MonthPart = DATEPART(MONTH, r.call_date)
AND d.MonthName = DATENAME(MONTH, r.call_date)
WHERE surrived = 'Y'
GROUP BY
d.YearPart, d.YearName, d.MonthPart, d.MonthName
ORDER BY
d.YearName, d.MonthPart
基本上,它旨在计算每月/每年的生存事件数。我希望能够标准化这些数据。也就是说,将每个月的生存事件数除以事件总数。这样,数据具有更多意义,因为事件总数每月变化。
有没有办法可以在查询中执行此操作?此特定查询针对MS SQL运行。
在下面的建议之后,我按如下方式修改了SQL:
删除WHERE子句并替换
COUNT(r.call_date) AS Events,
使用
COALESCE (SUM(CASE WHEN r.survived='Y' THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(r.call_date),0),)* 100 AS Events
答案 0 :(得分:1)
是。您可以单独计算年度总计,然后将该结果加入查询中,或者您可以使用分区:
Select MonthPart, YearPart
,Count(r.Call_Date) over (partition by YearPart, MonthPart) *1.0
/ Count(r.call_date) over () as StandardizedEvents
*1.0
是一种转换为十进制的简单方法,因此您可以避免整数除法。
ETA:如果您想计算幸存事件超过总数,请使用:
Select MonthPart, YearPart
,Count(case when survived = 'Y' then r.Call_Date end) over (partition by YearPart, MonthPart) *1.0
/ Count(r.call_date) over () as StandardizedEvents
答案 1 :(得分:1)
您可以尝试
...
SELECT
SUM(CASE survived WHEN 'Y' THEN 1 ELSE 0 END) /
COUNT(r.call_date) AS NormalisedEvents,
....