2016-06-20 18 views
1

我很想將您的幫助轉換爲連接此表的列。我試圖讓項目名稱(第1列)成爲它們自己的列標題,並輸入作爲列值的MUV值。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

哪些DBMS您使用的改變? –

+0

我們正在使用PostgreSQL。我們不能使用自定義函數,只能查詢不幸 – Hazjier

+0

您基本上想要一個數據透視表。你可以用'crosstab' https://www.postgresql.org/docs/9.1/static/tablefunc.html來完成,但是它會輸出一個靜態寬度的表格,其中包含預定義的列和類型。您需要在數據庫之外執行此操作。 或者,創建一個動態查詢,然後使用'EXECUTE'執行它# – 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. 串聯到由查詢所形成的標量(可能需要使用一個變量爲一個)
  2. 我可能已經混了一列某處
  3. 不知道如何傳遞{ACCOUNT_ID}參數,所以你可能需要太
+0

嗨,亞歷山大,非常感謝你花時間回答這個問題。當我運行查詢時,第一個左括號處出現語法錯誤(執行後) – Hazjier

+0

嘗試不帶括號的話執行此操作。我將在今天晚些時候嘗試在實際的DB上運行它。 – AlexanderMP

+0

非常感謝您的幫助。我試圖刪除括號並重新格式化查詢。我不斷遇到錯誤。任何你的幫助將是巨大的! – Hazjier