以前私が使用していたCASE関数を使用してMySQLでSELECTクエリをピボッティングするには洗練された解決策がありますが、期待した結果が得られないため、 。ピボットとケースとグループ
私はSELECTクエリで簡単にプルすることができる一意の参照のタイムスタンプの進行状況を追跡しようとしていますが、それらを行にピボットする必要があります。
SELECT c.ID, d.lead_id,
CASE WHEN s.summary LIKE '%submitted and status set to "Pending FA Approval"%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS a,
CASE WHEN s.summary LIKE '%("Pending FA Approval" => "Not Approved, Please Revise")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS b,
CASE WHEN s.summary LIKE '%("Not Approved, Please Revise" => "Pending FA Approval")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS c,
CASE WHEN s.summary LIKE '%("Pending FA Approval" => "Complete, Pending Payment")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS d,
CASE WHEN s.summary LIKE '%("Complete, Pending Payment" => "Paid, Complete")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS e,
CASE WHEN s.summary LIKE '%("Paid, Complete" => "Processing")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS f,
CASE WHEN s.summary LIKE '%("Paid, Complete" => "Processed")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS g
FROM lead_detail d
JOIN stream s ON s.object_id = d.lead_id
JOIN chapter c ON c.ID = d.`value`
WHERE d.field_number = 41
AND s.created >= "2017-02-15"
AND s.action = "status-change"
AND s.summary NOT LIKE "%Voided%"
AND c.ID = 549
これは以下を返します:私は次のクエリとすることを行っている
ID | lead_id | a | b | c | d | e | f | g
549 | 14512 | February 15, 2017 [08:53 PM]| NULL | NULL | NULL | NULL | NULL | NULL
549 | 14512 | NULL | NULL | NULL | February 15, 2017 [08:54 PM]| NULL | NULL | NULL
私が持っている問題は、私は私のクエリの最後にGROUP BY c.ID
を付加することにより、集計時に、私が得ることです:代わりに、私はあることを探していたものの
ID | lead_id | a | b | c | d | e | f | g
549 | 14512 | February 15, 2017 [08:53 PM]| NULL | NULL | NULL | NULL | NULL | NULL
:
ID | lead_id | a | b | c | d | e | f | g
549 | 14512 | February 15, 2017 [08:53 PM]| NULL | NULL | February 15, 2017 [08:54 PM]| NULL | NULL | NULL
これは相対的なサンプルですが、私が扱っている他の例では、CASEステートメントa-gの間で散発的に異なる値があります。私は多くの情報源を見ており、GROUP集合体はNULLでうまく配置されていないようですが、私は必要なものを得るために良い具体例や説明を見つけることができません。 CASE文は別の列にあり、日付エントリが作成されるときに返される値はNULL(または '')で置き換えられます。これは、より適切なリレーショナル表にデータを再編成するだけの利便性なしに、選択された照会でも実行する必要があります。
また、重要であれば、説明したとおりにこの例を解決する必要がありますが、UNIONによって追加のc.ID値にも結合されます。
私がこれについて完全に間違っていると指摘している場合でも、助けや指導をいただければ幸いです。
を作る方法を示す概略図である。[1](http://stackoverflow.com/questions/29360052/ use-coalesce-like-it-with-group-by-in-sql-server)、[2](http://stackoverflow.com/questions/11418870/sql-ugly-combination-of-group -by-and-coalesce) – yeputons
tl; dr:サブリクエストを使って 'a'などの値を見つけることができます。いくつかのnull以外の日付を見つけるために、 'a'、' b'、...カラムに 'max'のような集約関数を使ってみることができます。 – yeputons