2011年4月15日

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

投稿者 xml-rpc : 2011年4月15日 09:05
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103154
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。