簡體   English   中英

在 SQL 中轉置/旋轉數據

[英]Transposing/Pivoting Data in SQL

很抱歉再問一個與該主題相關的問題——我通讀了其他線程,但仍然無法弄清楚我的具體情況。

所以我有一個 output:

在此處輸入圖像描述

輸出上述內容的查詢是:

SELECT  (CASE
            WHEN ca.iteration = 'Pre' THEN '1. Pre'
            WHEN ca.iteration = 'Post-2' THEN '3. Post-2'
            WHEN ca.iteration = 'Post' THEN '2. Post'
            END) AS capes_iteration,
           ROUND(AVG(ca.emotional_problems_score)) AS avg_child_emotions_score,
           ROUND(AVG(ca.behavioral_problems_score)) AS avg_child_behaviors_score,
           ROUND(AVG(ca.total_score)) AS avg_total_intensity_score,
           ROUND(AVG(ca.total_parent)) AS avg_parent_confidence_score
     FROM  reporting_f5scppp.capes ca
LEFT JOIN  public.contacts c ON c.id = ca.contact_id
 GROUP BY  capes_iteration;

我希望它看起來像這樣:

在此處輸入圖像描述

我花了大約 4 個小時試圖解決這個問題——我只是 SQL 的初學者——看到這個問題的解決方案對我來說是一個很好的學習機會。

如果有人能提供一個簡單的解決方案——午餐在我身上!

您可以使用橫向連接取消透視分數。 然后重新聚合:

SELECT v.which,
       AVG(v.score) FILTER (WHERE ca.iteration = 'Pre') as avg_1_pre,
       AVG(v.score) FILTER (WHERE ca.iteration = 'Post-2') as avg_3_post_2,
       AVG(v.score) FILTER (WHERE ca.iteration = 'Post') as avg_2_post
FROM reporting_f5scppp.capes ca LEFT JOIN
     public.contacts c
     ON c.id = ca.contact_id LEFT JOIN LATERAL
     (VALUES (emotional_problems_score, 'emotional'),
             (behavioral_problems_score, 'behaviors'),
             (total_score, 'intensity'),
             (total_parent, 'parent')
     ) v(score, which)
GROUP BY  v.which;

一種選擇是通過使用each() function 來獲取鍵值元組,然后在主查詢中通過條件聚合進行旋轉:

SELECT (kv).key AS capes_iteration, 
       MAX(CASE WHEN iteration = 'Pre' THEN (kv).value END) AS "1. Pre",
       MAX(CASE WHEN iteration = 'Post-2' THEN (kv).value END) AS "3. Post-2",
       MAX(CASE WHEN iteration = 'Post' THEN (kv).value END) AS "2. Post"
  FROM
  (
   SELECT iteration, each(hstore(q) - 'iteration'::text) AS kv
     FROM (
           SELECT iteration,
                  ROUND(AVG(COALESCE(ca.emotional_problems_score,0))) AS avg_child_emotions_score,
                  ROUND(AVG(COALESCE(ca.behavioral_problems_score,0))) AS avg_child_behaviors_score,
                  ROUND(AVG(COALESCE(ca.emotional_problems_score,0)+
                            COALESCE(behavioral_problems_score,0))) AS avg_total_intensity_score,
                  ROUND(AVG(ca.total_parent)) AS avg_tot_parent_confidence_score
             FROM capes ca
             LEFT JOIN  contacts c ON c.id = ca.contact_id
            GROUP BY  iteration ) q ) q2
 GROUP BY capes_iteration
 ORDER BY capes_iteration

在哪里

  • 使用COALESCE() function 零作為第二個參數將 null 值分配為零
  • 請注意, avg_total_intensity_score是從添加兩列的派生列

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM