2

顧客、店舗への顧客の訪問、および店舗のレビューを保存する3つのテーブルがあります。

顧客
ID
生年月日...など

CustomerVisits
Customer_ID
Store_ID
VisitDate

レビュー
Store_IDCustomer_ID 評価
_

(うまくいけば)単一のSQLステートメントで取得する必要があるのは、店舗ごとのすべての時間の訪問者の数、店舗ごとの過去30日以内の訪問者の数、店舗ごとの平均顧客年齢、および店舗ごとの平均レビュースコアです。where Store_ID IN(1,2,3)のようなIN句を使用して、一度に複数のストアに対してこれを実行できるようにする必要があります。一時テーブルを作成してstore_idsをループし、複数のselectを実行できることはわかっていますが、可能であれば、単一のselectでこれを実行したいと思います。

前もって感謝します!

4

2 に答える 2

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;

これを行うためにstoresというテーブルがあると仮定し、すべてのストアに訪問またはレビューがあるわけではないことを前提として、LEFTJOINを使用しました。

私もかなり大雑把な方法で顧客の平均年齢を計算しましたが、それは平均的なものであり、実際には個人の正確な年齢を計算していないため、結果に悪影響を与えるとは思えません。

于 2013-03-06T13:50:55.803 に答える
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
于 2013-03-06T14:06:48.880 に答える