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を付けてみたりしましたが結果は同じです。 書き方に誤りがあるのか、もしくは、他にクロス集計の方法がありましたら、ご 教授頂けたら幸いです。 初穂太郎