1

データ システムから別のデータ システムに移行しています。新しいシステムには、クエリを作成してウィンドウに貼り付けてエンド ユーザーにプッシュできるカスタム レポート モジュールがあります。すべてのユーザーが要求しているレポートが 1 つありますが、その書き方がわかりません。

学年、性別、人種ごとに学校の人口を分類します。以下の添付を参照してください。

ここに画像の説明を入力

私はこれを学年ごとに人口を分類して書きましたが、ここからどこへ行くべきかわかりません.

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 です。Crystal Reports のようなレポート作成ソフトウェアを購入する必要があるかどうか疑問に思っています。

4

3 に答える 3

1

基本的に、数えているものすべてでグループ化する必要があります。これは、学年、人種、性別のようです。最初にそれを行います。必要な方法ですべてを行にまとめます。

混乱を招く可能性があるのは、レポートに 2 つのレベルのグループ化があることです。実際には、次のようになります。

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

それをクロス集計レポートに変換する方法は、自由に使用できるツールによって異なります。pivot演算子または一連のcaseを使用して、SQL で可能selectです。コツは、人種ごとに 3 つの列 (男性、女性、両方) が必要であることに注意することです。少し面倒ですが、サンプルはこちら

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

これにより、学年ごとに 2 つの行が生成され、各行の 2 番目の行に生徒の合計が表示されます。

あなたはアイデアを得る。また、学年と性別、および学年のみでグループ化された学生をカウントするためのクエリも必要です。これらは、ピボット クエリの出力に結合できます。そして、レースごとの合計、一番下の行は、グレード99またはそれを一番下に並べ替えるために結合されています。結果は、レポートの行と列のレイアウトと一致します。

于 2013-04-18T07:11:44.587 に答える
1

データの例がないため、性別と人種の情報が学生に対してキャプチャされていると推測されます。

やりたいことは、次のような初期テーブルを取得することです。

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、またはマトリックス レポートをサポートするその他のものを使用して、そのデータからピボットを作成します。

Pivotマトリックスで SQL句を使用する方法を知っているレポート ツールが利用できない場合: http://msdn.microsoft.com/en-us/library/ms177410(v=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 
于 2013-04-18T03:03:55.303 に答える