0

私はこのようなテーブルを持っています

Subject    Mark    Girls      Boys

Math        85      4          6
Math        86      1          3
Math        87      1          9
Math        92      2          9
Math        96      9          4
English     83      4          5
English     87      2          4 
English     91      2          3
English     99      4          1

そして、このデータを次のような別のテーブルに挿入したいと思います

Subject    Range    Girls    Boys
Math       80-89    6         19
Math       90-99    11        13
English    80-89    6         9
English    90-99    6         4

2 桁のスコアしかないと仮定すると、これを達成するためのクエリは何になるでしょうか。私は非常に単純なことを試みましたが、惨めGROUP BYIF MARK like 1%失敗しました。

4

4 に答える 4

1

マーク範囲を自動的に定義し、必要な結果を生成するクエリは次のとおりです。

SELECT 
  Subject, 
  CONCAT(MarkMin, '-', MarkMax),  
  (
    SELECT SUM(Girls) 
    FROM yourtable 
    WHERE Subject = Marks.Subject AND Mark >= MarkMin AND Mark <= MarkMax
  ) AS Girls,
  (
    SELECT SUM(Boys) 
    FROM yourtable 
    WHERE Subject = Marks.Subject AND Mark >= MarkMin AND Mark <= MarkMax
  ) AS Boys
FROM
(
SELECT
    Subject,
    ROUND(TRUNCATE(Mark/10,0),0) * 10 AS MarkMin,
    ROUND(TRUNCATE(Mark/10,0),0) * 10 + 9 AS MarkMax
FROM yourtable
GROUP BY Subject, MarkMin
) Marks;

デモ

于 2013-03-06T16:19:07.997 に答える
1

式を使用CASEして範囲を作成できます。さらに範囲がある場合は、それらを に追加しますCASE

select subject,
  case 
    when mark >= 80 and mark <= 89 then '80-89'
    when mark >= 90 and mark <= 99 then '90-99'
  end `Range`,
  sum(girls) Girls,
  sum(boys) Boys
from yourtable
group by subject, case 
    when mark >= 80 and mark <= 89 then '80-89'
    when mark >= 90 and mark <= 99 then '90-99'
  end
order by subject

SQL Fiddle with Demoを参照してください。

CASEでを繰り返したくない場合はGROUP BY、サブクエリを使用できます。

select subject, 
  `range`,
  sum(girls) girls,
  sum(boys) boys
from
(
  select subject,
    case 
      when mark >= 80 and mark <= 89 then '80-89'
      when mark >= 90 and mark <= 99 then '90-99'
    end `Range`,
    girls,
    boys
  from yourtable
) src
group by subject, `range`
order by subject

SQL Fiddle with Demoを参照してください。

次のような開始/終了範囲のテーブルを作成することを検討することをお勧めします。

create table mark_ranges
(
  start_range int,
  end_range int
);

insert into mark_ranges values
(0, 9),
(10, 19),
(20, 29),
(30, 39),
(40, 49),
(50, 59),
(60, 69),
(70, 79),
(80, 89),
(90, 99);

テーブルを作成したら、テーブルに参加することで範囲を取得するのは非常に簡単です。

select subject,
  `range`,
  sum(girls) girls,
  sum(boys) boys
from
(
  select t.subject,
    concat(r.start_range, '-', r.end_range) `range`,
    t.girls,
    t.boys
  from yourtable t
  inner join mark_ranges r
    on t.mark >= r.start_range
    and t.mark <= r.end_range
) src
group by subject, `range`

デモで SQL Fiddle を参照してください

于 2013-03-06T15:34:43.263 に答える
0

これを行う方法の例を次に示します。私はSQLServer2008を使用しました。正確な質問でクエリを変更できますが、私は考えを述べています。これで問題が解決した場合は、回答に[承認済み]のマークを付けてください。

-- sample: marks table
create table marks(sj varchar(200), mark  int, girl int, boy int)

-- insert some data
insert into marks values ('eng', 85, 2, 3)
insert into marks values ('eng', 86, 3, 4)
insert into marks values ('eng', 95, 4, 5)
insert into marks values ('eng', 95, 5, 6)

-- check data
select * from marks

-- create range table
create table marks_range(sj varchar(200), range varchar(200), girl int, boy int)

--now enter the ranges one by one

--80-89
insert into marks_range 
select sj, '80-89', SUM(girl), SUM (boy) from marks where mark < 90 and mark >= 80
group by sj

--90-99
insert into marks_range 
select sj, '90-99', SUM(girl), SUM (boy) from marks where mark < 100 and mark >= 90
group by sj

-- check result
select * from marks_range
于 2013-03-06T15:43:09.767 に答える
0

結果を達成するためのTSQLは次のとおりです。

select
    Subject,
    Range,
    Girls = Sum(Girls),
    Boys  = Sum(Boys)
from (
    values('80-89', 80, 89),
          ('90-99', 90, 99)
) T(Range, MinValue, MaxValue)
left join Data on Data.Mark between T.MinValue and T.MaxValue
group by Subject, Range
于 2013-03-06T15:36:39.963 に答える