2016-06-20 14 views
1

この表の列を行に転置するのが大好きです。私は、列名として入力されたMUV値を持つそれぞれの列ヘッダーになるプロジェクト名(列1)を持っているようにしようとしています。SQL:Chartioの行を列として動的に転置する

このトピックでは20以上のスレッドを読んでいますが、使用できないさまざまなSQLパッケージとコードを使用しています。

理想的なソリューションは、目的のクエリの出力を作成するには、このクエリを変更します:

現在のクエリ:

SELECT 
    cust_gae_account.project_name as "Project Name", 
    cust_be_project_usage.unique_visitor_count as "MUVs", 
    cust_be_project_usage.billing_period_start as "Month" 
FROM 
    cust_be_project_usage 
INNER JOIN 
    cust_gae_account 
    ON cust_gae_account.account_id = cust_be_project_usage.project_id 
WHERE 
    cust_be_project_usage.admin_account_id = {ACCOUNT_ID} 

現在のクエリ出力:

Project Name  |  MUVs  |  Month 
----------------------------------------------------- 
ProjectAAAAAZ |  68000  | Jun 01, 2016 
DynamicName  |  3200  | Jun 01, 2016 
ProjectAAAAAZ |  21000  | May 01, 2016 
DynamicName  |  4500  | May 01, 2016 
CustomProject |  117000  | Jun 01, 2016 
CustomProject |  118400  | May 01, 2016 

目的のクエリ出力:

Project Name  | CustomProject | ProjectAAAAAZ | DynamicName 
------------------------------------------------------------------- 
Jun 01, 2016  |  117000  |  68000  |  3200 
May 01, 2016  |  118400  |  21000  |  4500 

注:私たちはChartio経由のPostgreSQLを使用している

  • は、我々は唯一の私たちは、カスタム関数悲しげに
  • 名とプロジェクトの数は動的では使用できませんベースのSQL
  • を使用することができ、 1から20まで変化します
  • MUVは常に数値です。重複はありません
+0

ことを変更する必要がある場合がありますので、あなたが{ACCOUNT_ID}パラメータを渡す方法がわから? –

+0

私たちはPostgreSQLを使用しています。私たちはカスタム関数を使用することはできません、残念なことにクエリのみ – Hazjier

+0

あなたは基本的にピボットテーブルが必要です。 'crosstab' https://www.postgresql.org/docs/9.1/static/tablefunc.htmlでこれを行うことができますが、静的な幅のテーブルを出力します。定義済みのカラムとタイプがあります。あなたはDBの外でこれを行う必要があります。 または、動的クエリを作成し、 '実行 'を使用して実行してください – AlexanderMP

答えて

0

クロスタブhttps://www.postgresql.org/docs/9.1/static/tablefunc.htmlを使用できますが、静的な列の一覧でのみ機能します。だから動的クエリが必要です。そのクエリを定義して実行する必要があります。

EXECUTE ('SELECT * FROM crosstab(
    \'SELECT 
     cust_be_project_usage.billing_period_start as "Month", 
     cust_gae_account.project_name as "Project Name", 
     cust_be_project_usage.unique_visitor_count as "MUVs" 
    FROM 
     cust_be_project_usage 
    INNER JOIN 
     cust_gae_account 
     ON cust_gae_account.account_id = cust_be_project_usage.project_id 
    WHERE 
     cust_be_project_usage.admin_account_id = {ACCOUNT_ID}\', 
    \'SELECT 
     cust_gae_account.project_name as "Project Name" 
    FROM 
     cust_be_project_usage 
    INNER JOIN 
     cust_gae_account 
     ON cust_gae_account.account_id = cust_be_project_usage.project_id 
    WHERE 
     cust_be_project_usage.admin_account_id = {ACCOUNT_ID}\') 
AS ("Project Name" date, ' || 
    (SELECT 
     string_agg(cust_gae_account.project_name, ' int,') 
    FROM 
     cust_be_project_usage 
    INNER JOIN 
     cust_gae_account 
     ON cust_gae_account.account_id = cust_be_project_usage.project_id 
    WHERE 
     cust_be_project_usage.admin_account_id = {ACCOUNT_ID}) || ' int' 
|| ')') 

私はそれをテストすることはできません。それは動作するはずですが、私の疑念はこのような状況では、そうではないかもしれないです:クエリによって形成されたスカラーへの連結

  1. (その1のための変数を使用する必要がある場合があります)
  2. 私が混ざっている場合があります列のどこかに
  3. ないあなたが使用しているDBMSすぎ
+0

こんにちはアレクサンダー、これに時間を割いていただきありがとうございます。私がクエリを実行すると、最初の開きかっこ(実行後)で構文エラーが発生します – Hazjier

+0

その後、かっこなしで実行してください。私は今日後で実際のDB上で実行しようとします。 – AlexanderMP

+0

ありがとうございました。私は括弧を削除し、クエリを再フォーマットしようとしました。私は間違いが続いていました。あなたのどんな助けも巨大になるでしょう! – Hazjier

関連する問題