是否可以在SQL查询中标准化数据

时间:2015-08-18 00:53:43

标签: sql sql-server

我的查询类似于上一个问题的答案:

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

2 个答案:

答案 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

SQL小提琴:http://sqlfiddle.com/#!6/841b1/2/0

答案 1 :(得分:1)

您可以尝试

...
SELECT 
  SUM(CASE survived WHEN 'Y' THEN 1 ELSE 0 END) / 
  COUNT(r.call_date) AS NormalisedEvents,
....