[前][次][番号順一覧][スレッド一覧]

mysql:15567

From: ram <ram <ram@xxxxxxxxxx>>
Date: Wed, 13 Apr 2011 16:25:55 +0900
Subject: [mysql 15567] 列数が増えるとクロス集計ができない

MYSQL初心者です。はじめまして。
MYSQLの書き方について、お知恵を拝借できればありがたいです。
(誤ってFree MLのほうに送ってしまい、再送させて頂きます。)

◆実行環境
MYSQL5.1.41 Windows2003/R3
◆現象
年月日の入ったレコードから日付別のレコード件数を抽出する、いわゆるクロス
集計のSQLを実行しようとしたところ、列数が増えてくると、動きがおかしくな
るような現象が出ています。
対象テーブル TBL
日付 npdate char(8) yyyymmddの形式で数字が入る
コード1 tkcd char(5)
コード2 tksc char(4)
名称3 tknm char(40)
phpで以下のようなSQLを作成しています。
$sql="select a.tkcd,a.tksc,a.tknm,";
$sql.="sum(case when a.mm='01' then 1 else 0 end) '01',";
$sql.="sum(case when a.mm='02' then 1 else 0 end) '02',";
$sql.="sum(case when a.mm='03' then 1 else 0 end) '03',";
$sql.="sum(case when a.mm='04' then 1 else 0 end) '04',";
$sql.="sum(case when a.mm='05' then 1 else 0 end) '05',";
$sql.="sum(case when a.mm='05' then 1 else 0 end) '06',";
$sql.="sum(case when a.mm='05' then 1 else 0 end) '07',";
$sql.="sum(case when a.mm='05' then 1 else 0 end) '08',";
$sql.="sum(case when a.mm='05' then 1 else 0 end) '09',";
$sql.="sum(case when a.mm='05' then 1 else 0 end) '10',";
$sql.="sum(case when a.mm='05' then 1 else 0 end) '11',";
(以下略 '31'まで)
$sql.="from (select tkcd,tksc,tknm,substr(npdate,7,2) as mm from TBL ";
$sql.="where tknm <> '' and npdate >= '20110101' and npdate <=
'20110131') as a ";
$sql.="group by a.tkcd,a.tksc,a.tknm";

下記の例でいうと、列名が01〜09あたりまでは、正確に件数がカウントされた列
が作成されるのですが、列名10は列自体がカウントされず、また列数を少なくし
て10までにすると、列名10が作成されず、定義もしていない列11ができたりする
現象がおきています。

列数の制約としてもたかだか20も超えない程度ですし、データベース自体のテー
ブル数も5つほどしかありません。

最初はsubstrを直接case文の中に書いたり、sumをcountに変えたり、列名の前に
asを付けてみたりしましたが結果は同じです。

書き方に誤りがあるのか、もしくは、他にクロス集計の方法がありましたら、ご
教授頂けたら幸いです。

初穂太郎


[前][次][番号順一覧][スレッド一覧]