2016-12-21 23 views
1

我正在嘗試爲以下內容編寫查詢:寫表查詢並給出分數

計算過去90天內的事務數。注意:這需要平均爲新會員=(交易數量/成爲會員的天數)x 90

新會員是DateCreated從今天的0到90天之間的會員。

表結構:

Column Name   Datatype 
--------------------------------- 
Member_No   nvarchar(255) 
Order_No   int 
Transaction_Date datetime 
Net     money 
Date_Created  datetime 

而且,最後一步是數着交易後,我需要給一個分數。因此,如果一個成員都有數超過8個,然後給出分數的5

以下是範圍:`

Transaction count  Score 
    >8     5 
    6-8     4 
    4-6     3 
    2-4     2 
    0-2     1 

樣本數據:

Member No Sales Order Number Date Created Transaction Date Net 
M1    2332   01-10-15  10-07-16   354 
M2    2311   12-12-16  14-12-16   53 
M3    5422   04-10-14  07-10-14   35 
M5    4535   10-10-16  12-11-16   54 
M9    5522   03-05-15  07-10-15   55 
M3    5422   04-10-14  02-12-16   83 
M5    4534   10-10-16  13-12-16   73 
M3    5432   04-10-14  09-10-14   35 
M3    5484   04-10-14  11-10-16   34 
M3    5453   04-10-14  07-11-16   67 
M3    5474   04-10-14  09-11-16   56 
M3    5493   04-10-14  07-12-16   52 
M3    5452   04-10-14  10-12-16   75 
M3    5496   04-10-14  11-12-16   34 
M3    5442   04-10-14  13-12-16   90 
M3    5494   04-10-14  14-12-16   757 
M3    5464   04-10-14  16-12-16   72 
M5    4542   10-10-16  15-12-16   76 
M5    4502   10-10-16  17-12-16   72 
M5    4535   10-10-16  18-12-16   43 

輸出:

Member No Order Count (In last 90 days) Score 
    M1     0      1 
    M2     10      5 
    M3     9      5 
    M5     5      3 
    M9     0      1 

[注意:

M1是0,因爲dateCreated會從今天的日期(不是一個新的構件)和構件少於90天最後90天

未成交

M2順序計數是10,因爲DaetCreated是內90天數從今天的日期(新成員),也是交易日期在90 天,所以適用公式( 交易/天成爲會員的數量)×90)=(1/10)* 90 = 10這是ordercount> 8 +因此得分爲5.

由於會員在過去90天內進行了9次交易,因此訂單數量爲9。所以得分爲5.

M5的訂單數爲5,因爲DaetCreated在距離今天的日期(新成員)90天內,他的交易日期也在 90天之內,因此應用公式(交易數量/ 構件)×90)=(72分之4)* 90 = 5,它是在定單計數範圍4-6因此 得分3.

讓我知道是否有任何疑問。

+0

沒有,它不是任務 – Shivang

+1

所以你想從你的表中'COUNT(*)',你的成員編號'GROUP BY','WHERE'創建的日期在最近90天內,然後你想檢查每個'CASE' 'COUNT(*)',我猜。 – ZLK

+0

耶,幾乎和那些不合適的人一樣,給他們一個作爲分數...這就是我認爲的主要鎮壓 – Shivang

回答

0

我相信這是一個基本的聚集查詢,有一些額外的邏輯:

select memberno, 
     order_count_90_days, 
     (case when days_ago_start >= 90 
      then (case when order_count_90_days > 8 then 5 
         when order_count_90_days > 6 then 4 
         when order_count_90_days > 4 then 3 
         when order_count_90_days > 2 then 2 
         else 1 
        end) 
      else (case when (order_count_90_days * 90.0/days_ago_start) > 8 then 5 
         when (order_count_90_days * 90.0/days_ago_start) > 6 then 4 
         when (order_count_90_days * 90.0/days_ago_start) > 4 then 3 
         when (order_count_90_days * 90.0/days_ago_start) > 2 then 2 
         else 1 
        end) 
     end) as score     
from (select memberno, 
      datediff(day, min(transactiondate), getdate()) as days_ago_start, 
      sum(case when transactiondate >= getdate() - 90 then 1 else 0 end) as order_count_90_days 
     from sample 
     group by memberno 
    ) m; 
+0

Thank you..works perfect! – Shivang

0

以下內容完全沒有經過測試,但至少應該讓您瞭解您可以遵循的流程以使其正常工作。

我建議你讓每一步執行,並試圖瞭解他們做什麼和如何。

第一步:計算過去90天內的交易。

select Member_No, count(Order_No) as TransactionCount 
from Sales 
where datediff(day, Transaction_Date, getdate()) <= 90 
group by Member_No 

第二步:得到啓動,每位會員

select 
    Member_No, 
    min(Date_Created) as Date_Created, 
    datediff(day, min(Date_Created), getdate()) as Days_Old 
from Sales 
group by Member_No 

第三步日期和年齡:結合上述

select * 
from (
    select 
     Member_No, 
     min(Date_Created) as Date_Created, 
     datediff(day, min(Date_Created), getdate()) as Days_Old 
    from Sales 
    group by Member_No 
) dc 
join (
    select Member_No, count(Order_No) as TransactionCount 
    from Sales 
    where datediff(day, Transaction_Date, getdate()) <= 90 
) tc on tc.Member_No=dc.Member_No 

第四步:臨利率交易次數爲新成員

select 
    Member_No, 
    case when dc.Days_Old > 90 
     then tc.Transaction_Count 
     else tc.Transaction_Count * 90/dc.Days_Old 
    end as Transaction_Count   
from (
    select 
     Member_No, 
     min(Date_Created) as Date_Created, 
     datediff(day, min(Date_Created), getdate()) as Days_Old 
    from Sales 
    group by Member_No 
) dc 
join (
    select Member_No, count(Order_No) as TransactionCount 
    from Sales 
    where datediff(day, Transaction_Date, getdate()) <= 90 
) tc on tc.Member_No=dc.Member_No 

第五步,添加一個sc基於事務計數礦(注意,我改變了自己的分數表,以便它不重疊):

select 
    *, 
    case 
     when x.Transaction_Count > 8 then 5 
     when x.Transaction_Count between 6 and 7 then 4 
     when x.Transaction_Count between 4 and 5 then 3 
     when x.Transaction_Count between 2 and 3 then 2 
     else 1 
    end as Score 
from (
    select 
     Member_No, 
     case when dc.Days_Old > 90 
      then tc.Transaction_Count 
      else tc.Transaction_Count * 90/dc.Days_Old 
     end as Transaction_Count   
    from (
     select 
      Member_No, 
      min(Date_Created) as Date_Created, 
      datediff(day, min(Date_Created), getdate()) as Days_Old 
     from Sales 
     group by Member_No 
    ) dc 
    join (
     select Member_No, count(Order_No) as TransactionCount 
     from Sales 
     where datediff(day, Transaction_Date, getdate()) <= 90 
    ) tc on tc.Member_No=dc.Member_No 
) x 
+0

只是一個小小的改變正如我在原來的查詢中所說的那樣,0的交易計數應給予1分。當成員在過去90天內沒有成交時,將0作爲交易計數。 – Shivang

+0

我的代碼應該這樣做。 0被「else 1」覆蓋。 – Blorgbeard

+0

噢,我只注意到零天錯誤的零部件錯誤 – Blorgbeard