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

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>]