2017-05-08 7 views
1

私の頭が壁にぶつかった後、私はこのサンプルテーブルの内容でピボットデータを取得しようとしています。MysqlでGroup_Concatのif文を使用する方法

id--------------lastname-----total----rd    
0511-02-0318 Salvador 8.99 2015-09-08 
0214-02-0616 Alfaro 0  2015-09-08 
0214-02-0616 Alfaro 7.95 2015-09-07 
0214-02-0616 Alfaro 8.69 2015-09-04 
0214-02-0616 Alfaro 6.81 2015-09-01 
0214-02-0616 Alfaro 8.86 2015-08-29 
0214-02-0616 Alfaro 6.16 2015-08-28 
0214-02-0616 Alfaro 8.66 2015-08-27 
0214-02-0616 Alfaro 8.03 2015-08-26 
0214-02-0616 Alfaro 8.68 2015-08-25 
0214-02-0616 Alfaro 8.75 2015-08-24 
0511-02-0318 Salvador 9.17 2015-09-09 
0511-02-0318 Salvador 9.28 2015-09-10 
0415-02-0960 Martin 0  2015-09-18 
0415-02-0960 Martin 10.39 2015-09-17 
0415-02-0960 Martin 8.44 2015-09-16 
0415-02-0960 Martin 10.9 2015-09-15 
0415-02-0960 Martin 10.91 2015-09-14 
0415-02-0960 Martin 9.91 2015-09-11 
0415-02-0960 Martin 10.31 2015-09-10 
0415-02-0960 Martin 11.16 2015-09-09 
0415-02-0960 Martin 12.04 2015-09-08 
0415-02-0960 Martin 9.42 2015-09-07 
0415-02-0960 Martin 10.43 2015-09-04 
0415-02-0960 Martin 10.39 2015-09-03 

これは私の作業attempクエリですが、私は何かアップ逃したと思う:

SET @sql = NULL; 
set @sdate = '2015-09-01'; 
set @edate = '2015-09-06'; 

SELECT GROUP_CONCAT(

distinct concat('total=',list_of_dates) 

/*distinct concat('if(p.rd=''',list_of_dates,''',p.total',0,')')*/ 

) INTO @sql from 
(SELECT ADDDATE(date(@sdate), INTERVAL @i:[email protected]+1 DAY) AS list_of_dates 
FROM (
SELECT a.a 
FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a 
CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b 
CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c 
) a 
JOIN (SELECT @i := -1) r1 
WHERE 
@i < DATEDIFF(date(@edate),date(@sdate))) as a; 





set @sql = concat('select id, lastname, total, rd,',@sql,' from 
(select ''0511-02-0318'' as id, ''Salvador'' as lastname, 8.99 as total, ''2015-09-08'' as rd union all 
select ''0214-02-0616'', ''Alfaro'', 0 ,''2015-09-08'' union all 
select ''0214-02-0616'', ''Alfaro'', 7.95, ''2015-09-07'' union all 
select ''0214-02-0616'', ''Alfaro'', 8.69, ''2015-09-04'' union all 
select ''0214-02-0616'', ''Alfaro'', 6.81, ''2015-09-01'' union all 
select ''0214-02-0616'', ''Alfaro'', 8.86, ''2015-08-29'' union all 
select ''0214-02-0616'', ''Alfaro'', 6.16, ''2015-08-28'' union all 
select ''0214-02-0616'', ''Alfaro'', 8.66, ''2015-08-27'' union all 
select ''0214-02-0616'', ''Alfaro'', 8.03, ''2015-08-26'' union all 
select ''0214-02-0616'', ''Alfaro'', 8.68, ''2015-08-25'' union all 
select ''0214-02-0616'', ''Alfaro'', 8.75, ''2015-08-24'' union all 
select ''0511-02-0318'', ''Salvador'', 9.28, ''2015-09-10'' union all 
select ''0415-02-0960'', ''Martin'', 0, ''2015-09-18'' union all 
select ''0415-02-0960'', ''Martin'', 10.39, ''2015-09-17'' union all 
select ''0415-02-0960'', ''Martin'', 8.44, ''2015-09-16'' union all 
select ''0415-02-0960'', ''Martin'', 10.9, ''2015-09-15'' union all 
select ''0415-02-0960'', ''Martin'', 10.91, ''2015-09-14'' union all 
select ''0415-02-0960'', ''Martin'', 9.91, ''2015-09-11'' union all 
select ''0415-02-0960'', ''Martin'', 10.31, ''2015-09-10'' union all 
select ''0415-02-0960'', ''Martin'', 11.16, ''2015-09-09'' union all 
select ''0415-02-0960'', ''Martin'', 12.04, ''2015-09-08'' union all 
select ''0415-02-0960'', ''Martin'', 9.42, ''2015-09-07'' union all 
select ''0415-02-0960'', ''Martin'', 10.43, ''2015-09-04'' union all 
select ''0415-02-0960'', ''Martin'', 10.39, ''2015-09-03'')data'); 



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

ここにありますが私の試みの出力です:

enter image description here

pivot dateがある場合、私は出力をしたいですrdと等しい場合、ピボットdate contentはのvalueになりますただし、等しくなければ値は0になります。id and lastname become distinctまた、ピボット日付の場合、total=を削除する必要があります。

私はそのサンプルコメントコードを試しましたが運はありませんでした。

この1つが動作しますが、1行だけを返します。

GROUP_CONCAT(DISTINCT CONCAT("SUM(IF(data.rd='",DATE(list_of_dates),"',`total`,0)) AS `",list_of_dates,"`")) as `dates` 

enter image description here

すべてのヘルプは高く評価されます。事前に

おかげ

+0

は、テーブル内のデータですか?あなたのコードでは、テーブルから読み込むのではなく、データを生成しているようです。テーブルの名前は何ですか? –

+0

私は更新する準備ができているデータを準備していますが、それは私のテーブルから来ました。同じです。あなたはいつでもクエリを実行することができます。テーブルは必要ありません。 – redzsol

+0

@redzol:それはあなたのために働いたのですか?もしそうなら、受け入れられたものとしてマークしてください。そうでない場合は、どのようなエラーが発生したのか、何が動作しなかったのかを教えてください。 –

答えて

1

はUPDATE:私は、最終的な結果を生成select文を作成することから始め、その後書いたサブ合計の列

日付を注文するコードの一部を変更しましたそのselectステートメントを生成するコード。私はまた、SQL Fiddleを作成して、ステートメントと結果を作成しました。

手順でデータを偽造するのではなく、実際の表を作成しました。あなたが使用しているテーブルの名前がないので、あなたの特定のニーズに合うようにコードを修正する必要があります。

これは、いくつかのステップで動作

  • パラメータを設定し
  • が指定した範囲のデータから日付のリストを取得します(開始/終了日)。
  • SQL文を生成します。
  • SQLステートメントを実行します。

ここで私はモデルとして書いたテストのSQL文です:

SELECT 
    `id`, 
    `lastname`, 
    SUM(`total`) AS `total`, 
    SUM(if(`rd` = '2015-09-01',`total`,0)) AS `total:2015-09-01`, 
    SUM(if(`rd` = '2015-09-02',`total`,0)) AS `total:2015-09-02`, 
    SUM(if(`rd` = '2015-09-03',`total`,0)) AS `total:2015-09-03`, 
    SUM(if(`rd` = '2015-09-04',`total`,0)) AS `total:2015-09-04`, 
    SUM(if(`rd` = '2015-09-05',`total`,0)) AS `total:2015-09-05`, 
    SUM(if(`rd` = '2015-09-06',`total`,0)) AS `total:2015-09-06` 
FROM `test_table` 
WHERE `rd` BETWEEN @sdate AND @edate 
GROUP BY `id`,`lastname` 
ORDER BY `id`,`lastname` 

そして、ここでは、そのSQL文を生成し、実行するためのコードです:

/* Set the parameters */ 
SET @sql = NULL; 
SET @dates = NULL; 
SET @sdate = '2015-09-01'; 
SET @edate = '2015-09-06'; 

/* Get a list of dates, and format as the column def for the SQL SELECT */ 
SELECT 
    GROUP_CONCAT(CONCAT("SUM(IF(`rd` = '",DATE(`rd`),"',`total`,0)) AS `total:",DATE(`rd`),"`")) as `dates` 
FROM (SELECT `rd` FROM `test_table` GROUP BY `rd` ORDER BY `rd`) AS a 
WHERE a.`rd` BETWEEN @sdate AND @edate 
INTO @dates; 

/* Generate the SQL SELECT */ 
SELECT CONCAT("SELECT `id`,`lastname`,SUM(`total`) AS `total`,",@dates," FROM `test_table` WHERE `rd` BETWEEN @sdate AND @edate GROUP BY `id`,`lastname` ORDER BY `id`,`lastname`") 
INTO @sql; 

/* Execute the SELECT */ 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

投稿していただきありがとうございます。 – redzsol

+0

[Err] 1054 - 'フィールドリスト'の 'rd'列が不明 – redzsol

+0

どこですか?どのSQL文ですか? –

関連する問題