2012-01-24 2 views
1

아래의 쿼리는 제품의 최저 가격을 찾는 데 사용됩니다.그룹별로 중복 기록을 피하는 방법은 무엇입니까?

테이블 @Rates를 Available_Count 필드로 업데이트합니다.

하지만 GROUP BY 때문에 결과가 중복됩니다.

어떻게 업데이트합니까?

SET NOCOUNT ON DECLARE @Products TABLE (product_id VarChar(50),product_name VarChar(50)) 
INSERT INTO @Products Values ('1','Pen'); 
INSERT INTO @Products Values ('2','Pencil'); 
INSERT INTO @Products Values ('3','ASchool Bag'); 
INSERT INTO @Products Values ('4','Book'); 
INSERT INTO @Products Values ('5','Pencil Box'); 

SET NOCOUNT ON DECLARE @Rates TABLE (product_id VarChar(50),price int, Avail_Count VarChar(50)) 
INSERT INTO @Rates Values ('1','10','1'); 
INSERT INTO @Rates Values ('3','5','5'); 
INSERT INTO @Rates Values ('1','5','6'); 
INSERT INTO @Rates Values ('4','20','3'); 
INSERT INTO @Rates Values ('4','15','2'); 
INSERT INTO @Rates Values ('5','30','1'); 

;WITH CTE AS (
SELECT 
    count(*) over() Total_Record, 
    p.product_id, p.product_name, ISNULL(MIN(r.price), 0) AS MinPrice, 
    case when ISNULL(MIN(r.price), 0) > 0 then 1 else 0 end as sortOrder, 
    R.Avail_Count 
FROM 
    @Products p LEFT OUTER JOIN @Rates r 
ON 
    r.product_id = p.product_id 
GROUP BY 
    p.product_id, p.product_name,R.Avail_Count 

),ROWNUM as (Select *,ROW_NUMBER() OVER (ORDER BY sortOrder desc, MinPrice asc,Product_name) 
AS RowNumber from CTE) 
Select * from ROWNUM 

답변

1

표시 할 avail_count를 모르겠습니다. GROUP BY에 avail_count를 포함하고 있기 때문에 중복 값을 얻고 있으며 서로 다른 값을 가지고 있습니다. avail_count 값이 min 값과 같은 행에 있도록 하시겠습니까? 그럴 경우 :

;WITH x AS 
(
    SELECT 
     Total_Record = COUNT(*) OVER(), 
     rn = ROW_NUMBER() OVER (PARTITION BY p.product_id ORDER BY r.price), 
     p.product_id, 
     p.product_name, 
     MinPrice = COALESCE(r.price, 0), 
     sortOrder = CASE WHEN COALESCE(r.price, 0) > 0 THEN 1 ELSE 0 END 
    FROM 
     @Products AS p 
    LEFT OUTER JOIN 
     @Rates AS r 
     ON r.product_id = p.product_id 
) 
SELECT 
    Total_Record, 
    product_id, 
    product_name, 
    MinPrice, 
    sortOrder, 
    RowNumber = ROW_NUMBER() OVER (ORDER BY sortOrder DESC, MinPrice, product_name) 
FROM x WHERE rn = 1; 

그렇다면 중복을 원하지 않는다고 설명하는 것보다 실제 원하는 결과를 표시해야합니다.

+0

MinPrice에 해당하는 "available_Count"를 표시하는 방법 – user475464

+1

죄송합니다, 샘플 데이터를 기준으로 원하는 결과를 표시하십시오. 아무도 단어 문제를 해결하고 싶지 않습니다. –

관련 문제