1

そのタイトルは意味をなさないかもしれません、私が何をしようとしているのかを一文で尋ねる方法がわかりません...

次のようなMySQLテーブルがあります。

| id | user  | team   | month | result |
|----|-------|--------|-------|--------|
| 1  | Joe   | red    | sept  | 100    |
| 2  | Joe   | red    | oct   | 40     |
| 3  | Jim   | red    | sept  | 70     |
| 4  | Jim   | red    | oct   | 50     |
| 5  | Susy  | red    | sept  | 40     |
| 6  | Tim   | blue   | sept  | 60     |
| 7  | Tim   | blue   | oct   | 100    |
| 8  | Betty | blue   | sept  | 70     |
| 9  | Dave  | blue   | sept  | 20     |
| 10 | Stan  | green  | oct   | 40     |
| 11 | Alan  | green  | sept  | 80     |
| 12 | Tina  | green  | oct   | 100    |
| 13 | Tina  | green  | sept  | 30     |
| 14 | Rick  | yellow | oct   | 50     |
| 15 | Ellen | yellow | oct   | 60     |

最終的に、チームと月ごとに整理された 50 を超える結果を持つユーザーの総数を示す HTML テーブルを出力しようとしています。

私が今実行しているクエリは次のとおりです。

SELECT team, month, count(*)
FROM example
WHERE result >= 50
GROUP BY team, month

これはこれを返します:

| team   | month | count(*) |
|--------|-------|----------|
| blue   | oct   | 1        |
| blue   | sept  | 2        |
| green  | oct   | 1        |
| green  | sept  | 1        |
| red    | oct   | 1        |
| red    | sept  | 2        |
| yellow | oct   | 2        |

しかし、私の HTML テーブルでは、月を列としてリスト (および合計列を追加) したいと考えています。したがって、次のようにレンダリングされる HTML テーブル (並べ替えは無視してください。任意です):

| Team   | sept | oct | Total |
|--------|------|-----|-------|
| red    | 2    | 1   | 3     |
| blue   | 2    | 1   | 3     |
| green  | 1    | 1   | 2     |
| yellow | 0    | 2   | 2     |

私が持っているクエリ結果を処理して、どうにかしてそれを PHP/HTML の最終形式に操作できますか? それとも、そもそもクエリの方法を変更する必要がありますか?

* HTML テーブルの出力例を変更するための編集 - 元のテーブルにさらに月が追加されると、結果の HTML テーブルが水平方向に拡張できるように、これを動的にしたいと考えています。

4

1 に答える 1

2

必要な基本的な SQL は次のとおりです。

SELECT  Team,
        COUNT(CASE WHEN Month = 'Sept' THEN 1 END) AS Sept,
        COUNT(CASE WHEN Month = 'Oct' THEN 1 END) AS oct,
        COUNT(*) AS Total
FROM    T
GROUP BY Team;

SQL Fiddle の例

必要な列の数がわからない場合は、準備されたステートメントを使用して動的に行う必要があります。

SET @sql = NULL;
SELECT  GROUP_CONCAT(DISTINCT
            CONCAT(
                'COUNT(CASE WHEN Month = ''',
                Month,
                ''' THEN 1 END) AS ',
                Month
                )
            ) 
INTO    @sql
FROM    T;

SET @sql = CONCAT('SELECT Team, ', @sql, ', COUNT(*) AS Total FROM T GROUP BY Team');

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

SQL Fiddle の例

于 2013-10-10T16:40:32.800 に答える