Sql server 如何避免group by中的重复记录?

Sql server 如何避免group by中的重复记录?,sql-server,tsql,sql-server-2005,group-by,Sql Server,Tsql,Sql Server 2005,Group By,下面的查询用于查找产品的最低价格 我用字段可用\u计数更新我的表@Rates 但由于分组的原因,结果是重复的 我如何更新这个 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 INT

下面的查询用于查找产品的最低价格

我用字段可用\u计数更新我的表@Rates

但由于分组的原因,结果是重复的

我如何更新这个

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 

我不知道你想展示哪一个。您得到的是重复项,因为您将avail_count包括在GROUP BY中,并且它们具有不同的值。是否希望avail_计数值恰好与最小值位于同一行上?如果是,则:

;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;

如果没有,那么您需要显示实际的所需结果,而不仅仅是解释您不想要重复的结果。

我不确定您想要显示哪个可用计数。您得到的是重复项,因为您将avail_count包括在GROUP BY中,并且它们具有不同的值。是否希望avail_计数值恰好与最小值位于同一行上?如果是,则:

;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;

如果没有,则您需要显示实际的预期结果,而不仅仅是解释您不想要重复的结果。

如何按照最低价格显示等效的“可用计数”。对不起,请根据样本数据显示预期结果。没有人想解决文字问题。如何根据MinPrice显示等效的“可用数量”。对不起,请根据示例数据显示所需结果。没有人想解决文字问题。