1

このテーブル Lineas (id、date、proyect_id、hours) があり、日付ごとの時間の合計を 1 週間に選択したいと考えています。たとえば、2013 年 1 月 1 日から 2013 年 5 月 1 日までの日付については、次の出力が必要です。

Proyect   | 01/01/2013 | 02/01/2013 | 03/01/2013 | 04/01/2013 | 05/01/2013
Proyect1  |     -      |     5      |     -      |     4      |     4
Proyect2  |     4      |     2      |     8      |     4      |     2
Proyect3  |     4      |     1      |     -      |     -      |     2

そして、これはテーブル内のデータです

   Id   |   Proyect_id   |    date    | hours
    1   |   Proyect1     | 02/01/2013 |   5
    2   |   Proyect1     | 04/01/2013 |   4
    3   |   Proyect1     | 05/01/2013 |   4
    4   |   Proyect2     | 01/01/2013 |   4
    5   |   Proyect2     | 02/01/2013 |   2
    6   |   Proyect2     | 03/01/2013 |   8
    7   |   Proyect2     | 04/01/2013 |   4
    8   |   Proyect2     | 05/01/2013 |   2
    9   |   Proyect3     | 01/01/2013 |   4
    10  |   Proyect3     | 02/01/2013 |   1
    11  |   Proyect3     | 05/01/2013 |   2

助けや手がかりはありますか?

前もって感謝します

4

2 に答える 2

4

MySQL にはピボット関数がないため、集計関数と式を使用して機能を複製する必要がありますCASE

値がわかっている場合は、次のようにハードコーディングできます。

select Proyect_id,
  sum(case when date = '2013-01-01' then hours end) `2013-01-01`,
  sum(case when date = '2013-02-01' then hours end) `2013-02-01`,
  sum(case when date = '2013-03-01' then hours end) `2013-03-01`,
  sum(case when date = '2013-04-01' then hours end) `2013-04-01`
from Lineas
group by Proyect_id

デモで SQL Fiddle を参照してください

ただし、値が不明な場合は、準備済みステートメントを使用して動的 SQL を生成する必要があります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when date = ''',
      date,
      ''' then hours else 0 end) AS `',
      date, '`'
    )
  ) INTO @sql
FROM  Lineas;

SET @sql = CONCAT('SELECT Proyect_id, ', @sql, ' 
                  FROM Lineas 
                  GROUP BY Proyect_id');

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

デモで SQL Fiddle を参照してください

両方とも結果が得られます。

| PROYECT_ID | 2013-01-01 | 2013-02-01 | 2013-03-01 | 2013-04-01 |
------------------------------------------------------------------
|   Proyect1 |          0 |          5 |          0 |          4 |
|   Proyect2 |          4 |          2 |          8 |          4 |
|   Proyect3 |          4 |          1 |          0 |          0 |
于 2013-02-26T14:38:15.790 に答える
2

集計を使用して、MySQL でこのピボットを実行できます。

select proyect_id,
       sum(case when date = '01/01/2013' then hours end) as "01/01/2013",
       . . .
from t
group by proyect_id

残りの列の. . .平均など。

于 2013-02-26T14:31:51.730 に答える