2017-02-16 6 views
0

以前私が使用していた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値にも結合されます。

私がこれについて完全に間違っていると指摘している場合でも、助けや指導をいただければ幸いです。

+0

を作る方法を示す概略図である。[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

+0

tl; dr:サブリクエストを使って 'a'などの値を見つけることができます。いくつかのnull以外の日付を見つけるために、 'a'、' b'、...カラムに 'max'のような集約関数を使ってみることができます。 – yeputons

答えて

1

任意の論理的な意味をなしませんだけで、あなたの現在のクエリにGROUP c.IDを追加する、とすぐにGROUP BY指定すると、あなたは、レコードの集約グループにデータベースを言っているので、でも、ほとんどのデータベースで実行されません。したがって、選択する列はすべてグループそのもの(つまり、c.IDを選択してもかまいません)またはには、MAX()SUM()などの集計関数が必要です。ここで

SELECT c.ID, 
     d.lead_id, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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 
INNER JOIN stream s 
    ON s.object_id = d.lead_id 
INNER 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 
GROUP BY c.ID 

は、私はこれらの質問のいずれかが助けるべきだと思うMAX()ピボット作業

id | col 
1 | 2   <-- the max of col when id=1 is 2, because NULLs are ignored 
1 | NULL 
1 | NULL 
2 | NULL 
2 | 5   <-- the max of col when id=2 is 5, because NULLs are ignored 
2 | NULL 
+1

非常に高く評価されています。私はこの仕事をすることができます。私の間違った前提とGROUP c.IDの使用で正しいです、それは複数の結果を得るためにUNIONを使用することに決定される前に、大きな試みのハックとスラッシュでした。あなたの具体的な例は、私が求めていたものを正確に提供しています。多くのおかげです。 –

関連する問題