[英]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.