2012-01-24 26 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

申し訳ありません、サンプルデータに基づいて希望する結果を示してください。誰も言葉の問題を解決しようとしません。 –

関連する問題