標籤:code 篩選 過程 包含 活動 需求 記錄 lin 並且
前兩天有事情 停了2天
資料需求:
1、活動日期11.8-11.10訂單
2、單筆訂單購買A類產品 B類產品滿足68元、且連續3天下單的使用者ID
首先第一個條件很簡單,主要是第二個條件 第二個條件是 且 邏輯運算
並且計算每個欄位維度也不一樣,單筆訂單購買A、B 滿足68 這個情況包含一個使用者一天下多個訂單 這個是一個使用者多條記錄的情況 我稱之為多對一
第二個條件 連續3天下單的使用者ID 這個是一對一的記錄 一行一條記錄 是一個使用者對應這三天的下單天數總計 我稱之為一對一
第一種呈現方式:我想呈現的是這樣的一個表包含下面一個欄位
一個使用者,下單天數,三天每一天的金額(符合單筆訂單AB和>=68,因此需要一個最細的明細 一個訂單具體到每個產品去的原始明細 這樣看起來比較清晰 這個展現的過程是把單筆訂單滿足條件的使用者先篩選出來 然後再去判斷他的下單天數
a3表having 已經對使用者ID 進行了單筆訂單滿足條件的控制 然後下面就是計算下單天數 因為一天可能會出現多個訂單 所以需要再進行一次對使用者 和 訂單日期的Group by
最後計算count(訂單日期) 天數 按照天數降序 以group by 使用者 結束 把使用者中符合單筆條件的下單天數計算出來 再去判斷就可以把使用者找出來
這樣表的結果也是一對一 一個使用者一行記錄
SELECT 城市,使用者ID,使用者名稱稱,SUM(金額) AS 3天總金額,COUNT(訂單日期) AS 下單天數,SUM(IF(訂單日期=‘2016-11-08‘,AB金額和,NULL)) AS 8日AB金額和,SUM(IF(訂單日期=‘2016-11-09‘,AB金額和,NULL)) AS 9日AB金額和,SUM(IF(訂單日期=‘2016-11-10‘,AB金額和,NULL)) AS 10日AB金額和FROM ( SELECT 城市,使用者ID,使用者名稱稱,訂單日期,SUM(金額) AS 金額,SUM(AB金額和) AS AB金額和,SUM(A金額) AS A金額,SUM(B金額) AS B金額 FROM ( SELECT 城市,使用者ID,使用者名稱稱,訂單日期,訂單ID,SUM(金額) AS 金額,(SUM(IF(產品分類="A",金額,0))+SUM(IF(產品分類="B",金額,0))) AS AB金額和,SUM(IF(產品分類="A",金額,NULL)) AS A金額 ,SUM(IF(產品分類="B",金額,NULL)) AS B金額 FROM( SELECT 城市,使用者ID,使用者名稱稱,DATE(訂單日期) AS 訂單日期,`訂單ID`,a1.`產品ID`,a1.`產品名稱`,`產品分類`,`金額` FROM `a003_order` AS a1 LEFT JOIN `a002_sku` AS a2 ON a1.產品ID=a2.產品ID WHERE 城市=‘濟南‘ AND 訂單日期>="2016-11-08" AND 訂單日期<"2016-11-11" AND 金額>0 ) AS a3 GROUP BY 訂單ID HAVING (SUM(IF(產品分類="A",金額,0))+SUM(IF(產品分類="B",金額,0)))>=68 ORDER BY 使用者ID ) AS a GROUP BY 使用者ID,訂單日期) AS bGROUP BY 使用者IDORDER BY COUNT(訂單日期) DESC
第二種呈現方式:我先把所有使用者在這3天中的匯總情況計算出來,一個使用者一行記錄,下單天數,下定單總數,3天A的總額,B的總額,AB總額和,這個是主表
最後再去判斷這些使用者 哪些是單筆訂單滿足68的的使用者 當做從表 left join 主表 以使用者相同為條件
這兩個表都是一對一的表 都從使用者為角度出發
SELECT a.*,b.標識FROM (#以使用者ID匯總 一對一 3天內所有下單的使用者 SELECT 城市,使用者ID,COUNT(訂單日期) AS 下單天數,SUM(訂單數) AS 訂單數,SUM(AB金額和) AS AB金額和,SUM(A金額) AS A金額,SUM(B金額) AS B金額 FROM ( SELECT 城市,使用者ID,訂單日期,COUNT(訂單ID) AS 訂單數,SUM(AB金額和) AS AB金額和,SUM(A金額) AS A金額,SUM(B金額) AS B金額 FROM ( SELECT 城市,使用者ID,DATE(訂單日期) AS 訂單日期,訂單ID,SUM(金額) AS 訂單總額 ,(SUM(IF(a2.產品分類="A",金額,0))+SUM(IF(a2.產品分類="B",金額,0))) AS AB金額和 ,SUM(IF(a2.產品分類="A",金額,NULL)) AS A金額 ,SUM(IF(a2.產品分類="B",金額,NULL)) AS B金額 FROM `a003_order` AS a1 LEFT JOIN `a002_產品` AS a2 ON a1.產品ID=a2.產品ID WHERE 城市=‘濟南‘ AND 訂單日期>="2016-11-08" AND 訂單日期<"2016-11-11" AND 金額>0 AND 使用者ID=44825 GROUP BY 訂單ID ) AS a3 GROUP BY 使用者ID,訂單日期 ) AS a4 GROUP BY 使用者ID) AS aLEFT JOIN (#取出AB和單筆訂單>=68的使用者訂單 一對一 SELECT b3.* FROM (#訂單ID明細 一個使用者對應多個訂單ID 一對多 SELECT 城市,使用者ID,DATE(訂單日期) AS 訂單日期,訂單ID,SUM(金額) AS 訂單總額 ,(SUM(IF(b2.產品分類="A",金額,0))+SUM(IF(b2.產品分類="B",金額,0))) AS AB金額和 ,SUM(IF(b2.產品分類="A",金額,NULL)) AS A金額 ,SUM(IF(b2.產品分類="B",金額,NULL)) AS B金額 ,CASE WHEN (SUM(IF(b2.產品分類="A",金額,0))+SUM(IF(b2.產品分類="B",金額,0)))>=68 THEN "3天內有單筆訂單>=68" ELSE NULL END AS 標識 FROM `a003_order` AS b1 LEFT JOIN `a002_產品` AS b2 ON b1.產品ID=b2.產品ID WHERE 城市=‘濟南‘ AND 訂單日期>="2016-11-08" AND 訂單日期<"2016-11-11" AND 金額>0 AND 使用者ID=44825 GROUP BY 訂單ID ORDER BY (SUM(IF(b2.產品分類="A",金額,0))+SUM(IF(b2.產品分類="B",金額,0))) DESC ) AS b3 WHERE 標識 IS NOT NULL GROUP BY 使用者ID) AS b ON a.使用者ID=b.使用者ID
MySQL多個條件以什麼表當做主條件表_20161111周五