簡體   English   中英

我如何為附加的報告編寫SQL?

[英]How would I go about writing the SQL for the attached report?

我們正在從數據系統轉向另一個。 我不得不重寫一些報告,新系統有一個自定義報告模塊,您可以在其中編寫查詢並將其粘貼到窗口中並將其推送給最終用戶。 我有一個報告,所有用戶都在請求,但我無法弄清楚如何編寫它。

它按年級,性別和種族划分了學校人口。 見下文附件。

在此輸入圖像描述

我寫了這個,按年級分解人口,但不知道從哪里開始。

SELECT
gl.title as Grade,
COUNT (s.student_id)
FROM
students s,
student_enrollment se,
school_gradelevels gl
WHERE
s.student_id = se.student_id
AND se.school_id=gl.school_id
AND se.grade_id=gl."id"
AND se.syear =2012
AND se.end_date IS NULL
AND se.school_id =10

group by gl.title

order by Grade;

作為參考,性別是s.gender,種族是s.race。 我想知道是否需要購買像水晶報告這樣的報告軟件。

沒有數據示例,因此可以預測性別和種族信息是針對學生捕獲的。

你想要做的是獲得一個看起來像這樣的初始表:

GradeLevel   |   Category     |  NumOfStudents
------------------------------------------------
PK           |     B - Male   |  10
PK           |     B - Female |  12
0            |     B - Male   |  5
0            |     B - Female |  6

這樣做很容易實現:

SELECT
gl.title as GradeLevel,
s.Race + '-' +s.Gender as Category
COUNT (s.student_id) as NumOfStudents
FROM 
           students s,
inner join student_enrollment se on s.student_id = se.student_id,
inner join school_gradelevels gl on se.school_id=gl.school_id AND se.grade_id=gl."id"
WHERE
    se.syear =2012
AND se.end_date IS NULL
AND se.school_id =10

group by gl.title, s.Race + '-' +s.Gender

order by Grade;

接下來,您希望通過使用報告工具來使用其SSRS或Crystal或支持矩陣報告的任何其他內容,從數據中提取數據。

如果沒有可用的報表工具知道如何使矩陣使用SQL Pivot子句: http//msdn.microsoft.com/en-us/library/ms177410( Pivot = sql.105).aspx

SELECT GradeLevel, [B-Male], [B-Female] ....
FROM 
  (
      SELECT
      gl.title as GradeLevel,
      s.Race + '-' +s.Gender as Category
      COUNT (s.student_id) as NumOfStudents
      FROM 
                 students s,
      inner join student_enrollment se on s.student_id = se.student_id,
      inner join school_gradelevels gl on se.school_id=gl.school_id AND se.grade_id=gl."id"
      WHERE
          se.syear =2012
      AND se.end_date IS NULL
      AND se.school_id =10
      group by gl.title, s.Race + '-' +s.Gender   
  ) rawData
  PIVOT
  (
  SUM(NumOfStudents)
  FOR Category IN ( [B-Male], [B-Female], ... )
) AS pvt 

從根本上說,你必須按照你所計算的一切進行分組,這似乎是年級,種族和性別。 先做到這一點:把所有東西都排成行,總結你需要的方式。

令你困惑的是,該報告有兩個級別的分組:一個是分級,種族和性別,一個是分級和種族。 實際上,它看起來像這樣:

create view V as 
SELECT   gl.title as Grade
       , s.sex
       , s.race 
       , COUNT (s.student_id) as Q
FROM students as s
JOIN student_enrollment as se
ON s.student_id = se.student_id
JOIN school_gradelevels gl
ON se.school_id = gl.school_id
AND se.grade_id = gl.id
WHERE
    se.syear = 2012
AND se.end_date IS NULL
AND se.school_id = 10
group by gl.title, s.sex, s.race

select Grade, race, sex, Q
from V
UNION
select Grade, race, 'Z', sum(Q) as Q
from V
group by Grade, race

如何將其轉換為交叉表報告取決於您可以使用的工具。 在SQL中,可以使用pivot操作符或select的一系列case 訣竅是要注意每個種族需要三列:男性,女性和兩者。 這有點單調乏味,這是一個樣本

select   Grade, 1 as sort_order  
       , max(case race when 1 then 
                  case sex when 'M' then Q end end) as r1mq
       , NULL as r1mb
       , max(case race when 1 then 
                  case sex when 'F' then Q end end) as r1fq
       , max(case race when 2 then 
                  case sex when 'M' then Q end end) as r2mq
       , NULL as r2mb
       , max(case race when 2 then 
                  case sex when 'F' then Q end end) as r2fq
       ...
from V group by Grade
UNION
select   Grade, 2 as sort_order  
       , NULL as r1mq
       , max(case race when 1 then 
                  case sex when 'Z' then Q end end) as r1bq
       , NULL as r1fq
       , NULL as r2mq
       , max(case race when 2 then 
                  case sex when 'Z' then Q end end) as r2bq
       , NULL as r2fq
       ...
from V group by Grade
order by Grade, sort_order

每個等級產生兩行,每個行的第二行合並學生總數。

你明白了。 您還需要查詢來統計按年級和性別分組的學生,以及僅按年級分組。 這些可以加入您的數據透視查詢的輸出。 對於排在最后一排的比賽總數,以99或者等級聯合起來,使其排在最底層。 結果將與報表的行和列布局相匹配。

with detail as (
    select
        gl.title as grade, s.race, s.gender, count(s.student_id) total
    from
        students s
        inner join
        student_enrollment se using (student_id)
        inner join
        school_gradelevels gl on se.school_id = gl.school_id and se.grade = gl.id
    where
        and se.syear = 2012
        and se.end_date is null
        and se.school_id = 10
    group by 1, 2, 3
    order by 1, 2, 3
) agg as (
    select grade, array_agg(total) total
    from detail
    group by grade
)
select
    grade,
    (select sum(e) from unnest(total) s(e)) total_grade,
    total[1,1] + total[2,1] + total[3,1] + total[4,1] + total[5,1] + total[6,1] total_F,
    total[1,2] + total[2,2] + total[3,2] + total[4,2] + total[5,2] + total[6,2] total_M,
    total[1,1] total_A_F,
    total[1,2] total_A_M,
    total[1,1] + total[1,2] total_A,
    total[2,1] total_B_F,
    total[2,2] total_B_M,
    total[2,1] + total[2,2] total_B,
    total[3,1] total_H_F,
    total[3,2] total_H_M,
    total[3,1] + total[3,2] total_H,
    total[4,1] total_I_F,
    total[4,2] total_I_M,
    total[4,1] + total[4,2] total_I,
    total[5,1] total_M_F,
    total[5,2] total_M_M,
    total[5,1] + total[5,2] total_MM,
    total[6,1] total_W_F,
    total[6,2] total_W_M,
    total[6,1] + total[6,2] total_W,
from agg

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM