2016-10-03 14 views
1

に行を変換します。月も繰り返すことができます。しかし、月の値を量の値で列に転記したいのですが、mysqlで動的にそれを試してみると、別の値しか返すことができないため、私は許可しません。MySQLやPHPは、私は、テーブルのこの種を持っている列

以下のコードから別のものを削除しようとしましたが、機能しません。何かご意見は?

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`() 
BEGIN 
SET group_concat_max_len=2048; 
SET @sql = NULL; 

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(IF(month = ''', 
     month, 
     ''', amount, NULL)) AS ', 
     month 
    ) 
) INTO @sql 
FROM tmp_results; 

SET @sql = CONCAT('SELECT r.account, 
          r.region, ', 
          @sql, ' 
        FROM tmp_results r 
        LEFT JOIN accounts AS a 
        on r.account_id = a.id 
        GROUP BY r.account'); 

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

は、PHPのための答えを持っている場合は、私もそれを歓迎し、laravel 5でコレクションを使用しようと、まだ何もしません。私はこれを解決するために私の頭を数日間叩いています。

+0

「うまくいきません」はあまり具体的ではありません。何がうまくいかず、何のエラーがありますか?サーバの設定(例えば5.7デフォルト設定)によっては、 'select'の中で' r.region'を 'region(region)'に変更するか、 'GROUP BY r.account、r 'を使う必要があります。 'tmp_results'か' @ sql'が空であるかどうかをチェックしない限り、その場合はエラーになりますが、そうではないようですこの問題は 'month 'に無効な値がある場合、' '''や空白、 ' - '、...など)無効であれば動作しません。 – Solarflare

+0

は意味しません、私が望む結果を返しませんでした。それは私が表示する必要があった他の月を省略しました。 – Dhenn

+0

それは働いています、私は期待した結果を返していません – Dhenn

答えて

1

あなたも自分の年のための別々の列を持っているしたい場合、あなたは動的SQLコードに(あなたの列dateから計算)年を追加する必要があります。

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`() 
BEGIN 
    SET group_concat_max_len=2048; 
    SET @sql = NULL; 

    SELECT GROUP_CONCAT(DISTINCT CONCAT(
     'MAX(IF(month = ''', 
     month, 
     ''' and year(date) = ', 
     year(date), 
     ', amount, NULL)) AS `', 
     month, 
     '_', 
     year(date), 
     '`' 
    ) 
    order by date 
) INTO @sql 
    FROM tmp_results; 

    if coalesce(@sql,'') != '' then 
    set @sql = concat(', ', @sql); 
    end if; 

    SET @sql = CONCAT(
    'SELECT r.account, 
    r.region ', 
    coalesce(@sql,''), 
    ' FROM tmp_results r 
    LEFT JOIN accounts AS a 
    on r.account_id = a.id 
    GROUP BY r.account, r.region'); 

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

列は次のように名前が付けられます。 January_2017と、私はorder by dateを追加しました。そうでない場合は、通常は順序付けされません。

group by r.regionを追加しました。サーバ上でonly_full_group_byが有効になっていると動作しません(これはMySQL 5.7以降のデフォルト値です)。

空のテーブルのテストを追加しました。そうしないとエラーが発生します。コードを必要とせず、自分のコードの一部だけを自分のものにコピーすれば、コードに比べてr.regionの後にカンマがないことに気づき、SET @sql = CONCAT('SELECT r.account, r.region 'にもう一度追加する必要があります。

各月のコードの長さは約80であるため、最大可能クエリに合わせてgroup_concat_max_lenを増やす必要があります。

+0

あなたはとても素晴らしいです!ありがとう、あなたは私の問題を解決しました。私は今考えを得た。まず、年と月を1つの文字列にして重複値として考慮しません。 – Dhenn

+0

こんにちは、私はどこのステートメントを置くことに問題があり、私のパラメータは文字列、この部分でなければなりません: – Dhenn

+0

SET @ sql = CONCAT( 'アカウントとして、 r.regionとして、総 ' 合体(@sql、 '')のような量)、 、人、 ' GROUP BY 'tmp_results FROMはr.account_id = a.id ここa.ABE =オン ASアカウントをJOIN 左R' r.account、r.region ORDER By r.account_id '); – Dhenn

関連する問題