mysql:15571
From: ram <ram <ram@xxxxxxxxxx>>
Date: Fri, 15 Apr 2011 09:05:47 +0900
Subject: [mysql 15571] Re: [free:00880] 列数が増えるとクロス集計ができない
自己レスです。 原因が少し判りました。 浅はかでしたが、これはSQLの実行結果の問題ではなく、 phpの関数の仕様?であることが判りました。 mysql_fetch_arrayという関数で、配列に入った列名と列数を取得しているので すが、 その時の列数がselect文で定義されている列の数と合致していないようです。 phpのほうで解決すべき問題だと判りました。 大変お騒がせしました。 while ($item = mysql_fetch_array($rs)) { // MySQL 見出処理開始 if ($init) { // MySQL レコード項目数参照 $clct = count($item) >> 1; print "レコード項目数= $clct<BR>\n"; // MySQL 項目名参照 print '<table>'; print '<tr>'; reset($item); for ($i = 0; $i < $clct; $i++) { $tmp = each($item); // 添字キー読み飛ばしダミー $tmp = each($item); list($mds, $dmy) = $tmp; print "<th class='a'>$mds</th>"; } print "</tr>\n"; (2011/04/13 16:13), ram wrote: > MYSQL初心者です。お知恵を拝借できればありがたいです。 > (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を付けてみたりしましたが結果は同じです。 > > 書き方に誤りがあるのか、もしくは、他にクロス集計の方法がありましたら、ご > 教授頂けたら幸いです。 > > 初穂太郎 > > > >
-> 15571 2011-04-15 09:05 [ram <ram@xxxxxxxxxx>] Re: [free:00880] 列数が増えるとクロス集計ができない 15572 2011-04-15 09:40 ┗[Masaaki Matsuyama <m] 15574 2011-04-15 10:53 ┗[ram <ram@xxxxxxxxxx>]