【问题标题】:Organize groups of aggregated data into a predefined list of rows, instead of all data points as separate columns将聚合数据组组织到预定义的行列表中,而不是将所有数据点组织为单独的列
【发布时间】: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


    【解决方案1】:

    如果您事先知道所有列是什么,您可以使用 t-sql 中的 PIVOT 函数。

    https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15

    但是,我会让 SSRS、Power Bi 或其他任何东西来做这一切,像这样的数据透视是他们擅长的。尽管使用一些基本分组,我会转置您的查询。查询也会简单得多。我可能误解了,所以添加一个您的数据库表数据和预期结果的示例,我会更新答案。

    以查询的第一部分为例可能很简单

    SELECT c.sex, pr.EnrollmentDate, ar.PanelRiskLevel, Count(*) as EnrollmentCount
        FROM tblProgramResults pr
            JOIN tblClients c on pr.ClientID = c.ClientID
            JOIN tblAssessmentResults ar on pr.ClientID = ar.ClientID
        GROUP BY c.sex, pr.EnrollmentDate, ar.PanelRiskLevel
    

    这可以通过在 SSRS、Power NI 等中轻松实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2011-03-27
      • 2022-11-12
      • 1970-01-01
      相关资源
      最近更新 更多