【发布时间】:2020-03-26 20:50:58
【问题描述】:
我正在尝试在 SQL 中创建一个数据集,该数据集将为治疗程序编译结果。
我想显示按类别细分的每个风险级别的频率,如下所示:
SQL 看起来像这样,插入了无意义的虚拟数据:
Select *
From
( VALUES
('Total Enrollments',5,9,3,2),
('Total Successful',2,7,5,9),
('Total Failures',9,6,2,1),
('Failure - Drug Tests',2,1,4,7),
('Failure - Attendance Issues',2,6,9,2),
('Failure - Non-Payment',0,4,5,9),
('Failure - Other',3,9,3,1)
) t1 (Category,Low,Moderate,High,VeryHigh)
最终目的是将数据导入 SSRS Report builder 和可能的 PowerBI,我宁愿在 SQL 中进行聚合和组织,因为我讨厌处理 SSRS 中的表达式,我希望数据是尽可能便携,以便导出到 Excel、SSRS、PowerBI 等。
性能不是最重要的问题,因为此报告将在我们的报告服务器上每月运行一次,并自动发送给个人列表。
我目前有一个查询列出了我需要的所有数据点,但它们都是单独的列,这意味着在 SSRS 中组织它意味着手动创建一个矩阵。
因此,获取我的百万列的查询如下所示:
--DECLARE
--@StartDate and @EndDate variables will be passed in by SSRS
SELECT
--Males Enrolled during period, by risk level:
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.EnrollmentDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Low' THEN 1 ELSE 0 END) AS MalesEnrollmentsLow,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.EnrollmentDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Moderate' THEN 1 ELSE 0 END) AS MalesEnrollmentsModerate,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.EnrollmentDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'High' THEN 1 ELSE 0 END) AS MalesEnrollmentsHigh,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.EnrollmentDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Very High' THEN 1 ELSE 0 END) AS MalesEnrollmentsVeryHigh,
--Males Successful during period, by risk level:
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.SuccessDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Low' THEN 1 ELSE 0 END) AS MalesSuccessLow,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.SuccessDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Moderate' THEN 1 ELSE 0 END) AS MalesSuccessModerate,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.SuccessDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'High' THEN 1 ELSE 0 END) AS MalesSuccessHigh,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.SuccessDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Very High' THEN 1 ELSE 0 END) AS MalesSuccessVeryHigh,
--Males Failed during period, by risk level:
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Low' THEN 1 ELSE 0 END) AS MalesTotalFailLow,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Moderate' THEN 1 ELSE 0 END) AS MalesTotalFailModerate,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'High' THEN 1 ELSE 0 END) AS MalesTotalFaillHigh,
Sum(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and AssessmentResults.PanelRiskLevel = 'Very High' THEN 1 ELSE 0 END) AS MalesTotalFailVeryHigh,
--Now break the failures down by reason:
--Males failed for FLDRUGTEST during period, by risk level:
SUM(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and tblProgramResults.ProgramCompletedReasonCode = 'FLDRUGTEST' and AssessmentResults.PanelRiskLevel = 'Low' THEN 1 ELSE 0 END) AS MalesFailFLDRUGTESTLow,
SUM(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and tblProgramResults.ProgramCompletedReasonCode = 'FLDRUGTEST' and AssessmentResults.PanelRiskLevel = 'Moderate' THEN 1 ELSE 0 END) AS MalesFailFLDRUGTESTModerate,
SUM(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and tblProgramResults.ProgramCompletedReasonCode = 'FLDRUGTEST' and AssessmentResults.PanelRiskLevel = 'High' THEN 1 ELSE 0 END) AS MalesFailFLDRUGTESTHigh,
SUM(CASE WHEN clients.sex = 'M' and tblProgramResults.FailDate between @StartDate and @EndDate and tblProgramResults.ProgramCompletedReasonCode = 'FLDRUGTEST' and AssessmentResults.PanelRiskLevel = 'Very High' THEN 1 ELSE 0 END) AS MalesFailFLDRUGTESTVeryHigh
--There are 3 other 'failure' reasons...
FROM
tblProgramResults
--Get the gender info for each client
OUTER APPLY ( SELECT
Sex
From tblClients
WHERE tblClients.ClientID = tblProgramResults.ClientID
) Clients
--Get the assessment results for each client:
OUTER APPLY ( SELECT
PanelRiskLevel
from tblAssessmentResults
WHERE tblAssessmentResults.clientID = tblProgramResults.ClientID
) AssessmentResults
WHERE
--We're only interested in male clients for now, there will be a separate table for females as they are evaluated on a different risk scale
Clients.sex = 'M'
--We only want to look through programs that had an Enrollment, a Successful Completion, or a Failure during the specified date range:
and (tblProgramResults.EnrollmentDate between @StartDate and @EndDate or
tblProgramResults.SuccessDate between @StartDate and @EndDate or
tblProgramResults.FailDate between @StartDate and @EndDate
)
那么我如何获取大型查询的结果并将其组织成一个漂亮的表格,如第一张图片而不是大量的列?我正在尝试将大查询插入到创建表的小查询中,但我没有得到任何结果。还是当有更简单的方法时,我会以艰难的方式来做这件事?
【问题讨论】:
标签: sql sql-server reporting-services