2015-02-06 2 views
1

SQL에서 대답을 얻을 수 있도록 도와주십시오. 현재 테이블에 "Sell Count"를 기준으로 상위 3 개 제품을 보여주는 순위 필드를 반환하도록하고 싶습니다.순위 필드를 추가하고 상위 3 개 데이터를 반환하십시오.

내 표는 그것이 "순위"필드를 반환 할

Date Name ProductName SellCount 
1/2/2014 John Product1 55 
1/2/2014 John Product4 55 
1/2/2014 John Product7 10 
1/2/2014 John Product10 100 
1/3/2014 John Product2 55 
1/3/2014 John Product5 77 
1/3/2014 John Product8 25 
1/3/2014 John Product11 50 
1/4/2014 John Product3 55 
1/4/2014 John Product6 5 
1/4/2014 John Product9 44 
1/4/2014 John Product12 660 

. 따라서 매일 판매되는 상위 3 개 제품을 확인할 수 있습니다. 또한 두 개의 판매 개수가 서로 같은 경우 ('순위'필드 날짜 '2010 년 1 월 20 일'의 예) : 순위 중 하나를 2로, 다른 하나를 3으로 자동 할당하려고합니다.

Date Name ProductName SellCount Rank 
1/2/2014 John Product1 55 3 
1/2/2014 John Product4 55 2 
1/2/2014 John Product10 100 1 
1/3/2014 John Product11 50 3 
1/3/2014 John Product2 55 2 
1/3/2014 John Product5 77 1 
1/4/2014 John Product9 44 3 
1/4/2014 John Product3 55 2 
1/4/2014 John Product12 660 1 

제 질문에 답변이 충분하기를 바랍니다. 네가 정교하게 나를 필요로한다면 알려줘. SQL 형식의 솔루션을 고맙게 생각합니다. 모두에게 감사드립니다!

파트 2 질문 : 다른 열 통화 그룹을 추가하는 경우 얘들 아

나의 새로운 테이블

 Date Name Group   ProductName SellCount 
1/2/2014 John BigGroup1A Product7 10 
1/2/2014 John BigGroup1A Product10 100 
1/2/2014 John BigGroup1B Product2 55 
1/2/2014 John Group1A   Product1 55 
1/3/2014 John Group1B   Product6 5 
1/3/2014 John Group1C   Product9 44 
1/3/2014 John Group1C   Product4 55 
1/3/2014 John LargeGroup1A Product5 77 
1/4/2014 John LargeGroup2A Product8 25 
1/5/2014 John LargeGroup2B Product12 660 
1/6/2014 John MediumGroup2A Product11 50 
1/7/2014 John MediumGroup2A Product3 55 

무엇입니까 (I 그룹이라는 새 열, 나는 그것이 순위를 반환 할를 추가 "Date", "Group", "Count Count"에 기초하여 상위 3 위 순위를 부여 할 수 있습니다. 예를 들어 1/2/2014에 "BIGGroup1A"의 John이 100과 10을 팔았습니다. 순위가 1이됩니다. 제품 10에서는 2 위를, 제품 7에서는 2 위를 차지했습니다. 같은 날 1/2/2014 년에 그는 두 개의 다른 그룹에서 55와 55를 팔아서 둘 다 1이되어야합니다. 로직의 나머지 부분을 채웠습니다. 가.

Date Name Group   ProductName SellCount Rank 
1/2/2014 John BigGroup1A Product7 10   2 
1/2/2014 John BigGroup1A Product10 100   1 
1/2/2014 John BigGroup1B Product2 55   1 
1/2/2014 John Group1A   Product1 55   1 
1/3/2014 John Group1B   Product6 5   1 
1/3/2014 John Group1C   Product9 44   2 
1/3/2014 John Group1C   Product4 55   1 
1/3/2014 John LargeGroup1A Product5 77   1 
1/4/2014 John LargeGroup2A Product8 25   1 
1/5/2014 John LargeGroup2B Product12 660   1 
1/6/2014 John MediumGroup2A Product11 50   2 
1/7/2014 John MediumGroup2A Product3 55   1 

감사합니다. 두 번째 부분에 대한 해결책을 찾도록 도와주세요.

+0

나는 질문에 대한 부분이 추가되었습니다. 도움을 주신 모든 분들께 감사드립니다. – Nguyenal07

답변

2

사용 윈도우 화 기능 :

CREATE TABLE #Temp(
    [Date]  DATE, 
    Name  VARCHAR(20), 
    ProductName VARCHAR(20), 
    SellCount INT 
) 
INSERT INTO #Temp VALUES 
('1/2/2014', 'John', 'Product1', 55), ('1/2/2014', 'John', 'Product4', 55), ('1/2/2014', 'John', 'Product7', 10), 
('1/2/2014', 'John', 'Product10', 100), ('1/3/2014', 'John', 'Product2', 55), ('1/3/2014', 'John', 'Product5', 77), 
('1/3/2014', 'John', 'Product8', 25), ('1/3/2014', 'John', 'Product11', 50), ('1/4/2014', 'John', 'Product3', 55), 
('1/4/2014', 'John', 'Product6', 5), ('1/4/2014', 'John', 'Product9', 44), ('1/4/2014', 'John', 'Product12', 660); 

--Start of the solution 
;WITH CTE AS(
    SELECT 
     *, 
     [Rank] = ROW_NUMBER() OVER(PARTITION BY Name, [Date] ORDER BY SellCount DESC) 
    FROM #Temp --Replace this with your Table 
) 
SELECT * 
FROM CTE 
WHERE [Rank] <= 3 
ORDER BY [Date], [Rank] DESC 
--End of the solution  

DROP TABLE #Temp 

결과

Date  Name     ProductName   SellCount Rank 
---------- -------------------- -------------------- ----------- -------------------- 
2014-01-02 John     Product4    55   3 
2014-01-02 John     Product1    55   2 
2014-01-02 John     Product10   100   1 
2014-01-03 John     Product11   50   3 
2014-01-03 John     Product2    55   2 
2014-01-03 John     Product5    77   1 
2014-01-04 John     Product9    44   3 
2014-01-04 John     Product3    55   2 
2014-01-04 John     Product12   660   1 
+0

안녕하세요, 저는 SQL을 처음 사용합니다. 테이블이 이미 만들어져 있고 이름이 "MyTable"인 경우 SQL을 제공하여 SQL 서버 스튜디오에 배치하여 순위 필드가 작동하는지 테스트 할 수 있습니다. 감사합니다. – Nguyenal07

+0

오, 방금 샘플 데이터를 만들었습니다. CTE 안의'# Temp'를'MyTable'으로 대체하십시오. 의견이있는 업데이트 된 답변보기 –

+0

고마워요! 고맙습니다! – Nguyenal07

0

Sql Server에서 이러한 창 작업 기능을 살펴 보겠습니다. 필요에 맞을 것으로 확신합니다.

DENSE_RANK - 결과 집합의 파티션 내의 행 순위를 랭킹에 간격없이 반환합니다. 행의 순위는 해당 행 앞에 오는 별개의 순위의 수에 1을 더한 것입니다.

RANK - 결과 집합의 파티션 내 각 행의 순위를 반환합니다. 행의 순위는 해당 행 앞에 오는 순위의 수에 1을 더한 값입니다.

- 결과 집합의 파티션 내에서 각 파티션의 첫 번째 행에 대해 1부터 시작하는 행의 순차 번호를 반환합니다. 이 유형의 문제에 대해 함께 CTE와

Other Sql Server Ranking Functions

관련 문제