Count和Row_Number

时间:2017-04-21 15:57:48

标签: sql-server tsql

我希望每个Zipcodes获得前5个Store,其中包含最高的客户(zipcodes)。

请在下面查询我的问题:

SELECT T.[Store], T.[ZipCode], Count(T.[Customer])

FROM ( SELECT  T.[Store], T.[ZipCode], 
      Count(T.[Customer])  row_number() over (Partition By T.[StoreGitanjali] Order By Count (T.[Customer]) desc) as RN 
       FROM [Marketing].[dbo].[Poscus] as T    
Group By T.[StoreGitanjali], T.[ZipCode]) as T    
where T.RN <=5    
Group By T.[StoreGitanjali], T.[ZipCode]

请告诉我如何在此方案中使用Count。 谢谢!

2 个答案:

答案 0 :(得分:1)

示例

CREATE TABLE #t 
    (
        ID INT IDENTITY(1,1),
        Customer NVARCHAR(3),
        Store NVARCHAR(5),
        ZIP INT
    )
    INSERT INTO #t VALUES('a', 'XYZ', 1234)
                        ,('b', 'XYZ', 1234)
                        ,('c', 'PQR', 1231)
                        ,('d', 'PQR', 1231)
                        ,('e', 'PQR', 1231)
                        ,('f', 'XYZ', 1232)
                        ,('g', 'XYZ', 1232)
                        ,('h', 'XYZ', 1232)
                        ,('i', 'PQR', 1236)
                        ,('j', 'PQR', 1236)
                        ,('k', 'LMN', 1237)
    SELECT * FROM #t

enter image description here

解决方案,设置 WHERE part&lt; 2 根据您的要求。

SELECT  TotalCustomer, Store, ZIP, Part FROM (
    SELECT  
        COUNT(1) AS TotalCustomer, 
        Store, 
        ZIP, 
        ROW_NUMBER() OVER (PARTITION BY Store ORDER BY Store) AS Part 
    FROM #t
    GROUP BY Store, ZIP
) t
WHERE Part < 2
ORDER BY Part 

enter image description here

答案 1 :(得分:0)

;WITH CTE
AS(
    SELECT Store
        ,Zip
        ,COUNT(DISTINCT Customer) AS CustCount
    FROM #t
    GROUP BY Store,Zip
    --ORDER BY Store,Zip
    )
SELECT A.*
FROM(
        SELECT *
            --,DENSE_RANK() OVER(PARTITION BY Store ORDER BY CustCount DESC) AS DenRank
            ,ROW_NUMBER() OVER(PARTITION BY Store ORDER BY CustCount DESC) AS DenRank
        FROM CTE
        --ORDER BY Store,Zip
    ) AS A
WHERE A.DenRank <= 2
相关问题