0

レポートを生成するために必要な単純なデータベース(MySqlを使用)があります。

ユーザーから送信された週次ログを含むテーブルがあります。これらの各ログには、送信済み、承認済みなどの状態があります。

LogSubmissionsテーブル
+ ---- + -------- + -------- + --------- + ------- +
| id | weekId | userId | 情報...| 状態|
+ ---- + -------- + -------- + --------- + ------- +
| 0 | 0 | 1 | データ...| 0 |
| 1 | 0 | 2 | データ...| 1 |
| 1 | 0 | 3 | データ...| 1 |
| 2 | 1 | 1 | データ...| 0 |

週を追跡するテーブルもあります。

WeekManagerテーブル
+ ---- + ----------- + --------- + --------- +
| id | startDate | EndDate | ... |
+ ---- + ----------- + --------- + --------- +
| 0 | Date1 | Date2 | ... |
| 1 | Date3 | Date4 | ... |
| 2 | Date5 | Date6 | ... |

ユーザーテーブルの名前だけでなく、週を列として表示するレポートが必要です。ユーザーが送信した週次ログの状態が表示されます。たとえば、第1週のボブ送信の状態は0です。

報告する
+ ------ + -------- + -------- + -------- + ------- +
| 名前| 1週目| 2週目| 3週目| ... |
+ ------ + -------- + -------- + -------- + ------- +
| ボブ| 0 | 1 | 0 | ... |
| ジョー| 1 | 1 | 1 | ... |
| ジム| 0 | 0 | 0 | ... |

このレポートを機能させるのに少し問題があります。私の主な障害は、週が追加されることです。そのため、レポートの列の数が異なります。

これはここではかなり役に立ちましたが、静的な量の行しか処理しません。週数によって違うものが必要です。これを実現するために何らかのループを使用することを考えていましたが、それが可能かどうかはわかりません。

どんな助けでもありがたいです、ありがとう。

ユーザーテーブル:

ユーザーテーブル
+ ---- + ------ + --------- +
| id | 名前| ... |
+ ---- + ------ + --------- +
| 0 | ... | ... |
| 1 | ... | ... |
| 2 | ... | ... |
4

2 に答える 2

0

水平テーブルを垂直テーブルに変換しようとしているように聞こえます(必要に応じて一時テーブル)。ユニオンを使用して、この前の投稿に従ってこれを行います。SQLクエリ; 水平から垂直

于 2013-02-07T17:42:03.760 に答える
0

テーブルの構造が正確に明確ではありません(たとえば、どこで取得できるかわかりませんuser name)。

MySQLのピボットの基本的な設定では、集計関数と次のようCASEな式を使用します。

select 
  l.userid,
  max(case when w.id =0 then l.state end) Week1,
  max(case when w.id =1 then l.state end) Week2,
  max(case when w.id =2 then l.state end) Week3
from LogSubmissions l
left join WeekManager w
  on w.id = l.weekid
group by l.userid

SQL FiddlewithDemoを参照してください。

編集します。週数が不明な場合は、プリペアドステートメントを使用して動的SQLを生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when w.id = ',
      id,
      ' then l.state end) AS Week',
      id + 1
    )
  ) INTO @sql
FROM  WeekManager;

SET @sql = CONCAT('SELECT l.userid, ', @sql, ' 
                  from LogSubmissions l
                  left join WeekManager w
                    on w.id = l.weekid
                  group by l.userid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL FiddlewithDemoを参照してください

于 2013-02-07T17:48:20.500 に答える