2013-03-06 50 views
2

我有一個客戶,客戶回訪存儲到存儲三個表格,並存儲評論:SQL - 獲取多計數與標準

客戶
ID
出生日期...等。

CustomerVisits
CUSTOMER_ID
STORE_ID
VisitDate

評論
STORE_ID
CUSTOMER_ID
評級

我需要什麼樣的(希望)得到單個SQL語句是每個商店所有時間訪問者的數量,每個商店最近30天內訪問者的數量,每個商店的平均客戶年齡以及每個商店的平均評估分數。我需要使用一個IN子句,例如Store_ID IN(1,2,3),一次能夠爲多個商店做到這一點。我知道我可以創建一個臨時表並通過store_ids循環,運行多個選擇,但寧可在單個選擇中執行此操作(如果可能的話)。

在此先感謝!

+3

[你嘗試過什麼?](http://whathaveyoutried.com) – 2013-03-06 13:41:05

回答

2

你可以在子查詢如下執行每個計數:

SELECT Stores.Store_ID, 
     review.AvgRating, 
     cv.VisitsLast20days, 
     cv.TotalVisits, 
     cv.AvgCustomerAge 
FROM Stores 
     LEFT JOIN 
     ( SELECT Store_ID, [AvgRating] = AVG(Rating) 
      FROM Reviews 
      GROUP BY Store_ID 
     ) review 
      ON review.Store_ID = Stores.Store_ID 
     LEFT JOIN 
     ( SELECT CustomerVisits.Store_ID, 
        [VisitsLast30Days] = COUNT(CASE WHEN CustomerVisits.VisitDate >= DATEADD(DAY, -30, CURRENT_TIMESTAMP) THEN 1 END), 
        [TotalVisits] = COUNT(*), 
        [AvgCustomerAge] = AVG(DATEDIFF(DAY, Customer.BirthDate, CURRENT_TIMESTAMP))/365.25 
      FROM CustomerVisits 
        INNER JOIN Customer 
         ON Customer.Customer_ID = CustomerVisits.Customer_ID 
      GROUP BY CustomerVisits.Store_ID 
     ) cv 
      ON cv.Store_ID = Stores.Store_ID; 

我假設你有一個表叫賣場要做到這一點,並使用LEFT JOIN的上,並非每個店都有訪問或假設回顧。

我也使用了一種相當粗略的方法來計算一個客戶的平均年齡,但由於它只是一個平均值,並且實際上並沒有爲一個人計算出準確的年齡,我懷疑它會對結果產生不利影響

+0

偉大的作品!謝謝。 – user1091409 2013-03-06 14:02:15

1

嘗試:

select s.Store_ID, 
     count(distinct v.Customer_ID) all_time_visitors, 
     count(distinct case when datediff(d, v.VisitDate, getdate()) <= 30 then v.Customer_ID end) 30day_visitors, 
     avg(datediff(yy, c.BirthDate, getdate())) avg_customer_age, 
     max(r.avg_rating) avg_rating 
from Stores s 
left join CustomerVisits v on s.Store_ID = v.Store_ID 
left join Customers c on v.Customer_ID = c.Customer_ID 
left join (select Store_ID, avg(Rating) avg_rating 
      from Reviews 
      group by Store_ID) r on s.Store_ID = r.Store_ID 
where s.Store_ID in (1,2,3) /*amend as required*/ 
group by s.Store_ID 
+0

'Y'是'DAYOFYEAR'的縮寫,而不是'YEAR',所以這裏的avg_customer_age會在幾天內完成。 – GarethD 2013-03-07 10:03:13

+0

@GarethD:哦!謝謝 - 我已經相應地修改了查詢。 – 2013-03-07 10:15:52