计算列中的重复数据并每行显示一次-SQL

时间:2018-08-07 22:24:27

标签: sql sql-server

在我的表中,我试图将重复的Food_Name计数到另一个称为Duplicate_Value的列中。

SELECT [Food_ID]
      ,[Food_Name]
      ,[Amount]

FROM [Foodie].[dbo].[Food]

不带计数的普通查询

enter image description here

我试图像这样计算Duplicate_Values,但是当我执行查询时却没有结果

SELECT [Food_ID]
  ,[Food_Name]
  ,[Amount]
  ,COUNT(*) as Duplicate_Value
FROM [Foodie].[dbo].[Food]
GROUP BY
   [Food_ID]
  ,[Food_Name]
  ,[Amount]
HAVING 
   COUNT(*) > 1

所需的输出

enter image description here

4 个答案:

答案 0 :(得分:2)

您的解决方案差不多在这里-问题是尽管Food_Name的值是重复的,但Food_ID的值却没有。由于您的GROUP BY子句包含Food_ID,因此对于每个不同的Food_ID值,您至少要有一行,并且由于这些行中的每一行只有1个计数,它会在您的HAVING子句中过滤掉。

这里是对解决方案的小修改,应该可以按照您希望的方式工作:

SELECT MIN([Food_ID]) AS [Food_ID]
  ,[Food_Name]
  ,[Amount]
  ,COUNT(*) as Duplicate_Value
FROM [Foodie].[dbo].[Food]
GROUP BY
  [Food_Name]
  ,[Amount]
HAVING 
  COUNT(*) > 1

根据您期望的输出,我不确定Food_ID想要什么值,因此您可以尝试使用MIN()以外的其他汇总。

如果Amount列中的每一行的值也不同,那么您需要从GROUP BY子句中删除该列,并在SELECT语句中使用聚合函数,如下所示:好吧:

SELECT MIN([Food_ID]) AS [Food_ID]
  ,[Food_Name]
  ,AVG([Amount]) AS [Average_Amount]
  ,COUNT(*) as Duplicate_Value
FROM [Foodie].[dbo].[Food]
GROUP BY
  [Food_Name]
HAVING 
  COUNT(*) > 1

答案 1 :(得分:2)

使用聚合!

select min(food_id) as food_id, food_name, count(*) as duplicate_value
from [Foodie].[dbo].[Food] f
group by food_name;

答案 2 :(得分:1)

您可以尝试将COUNTROW_NUMBER与Windows功能配合使用。

CREATE TABLE T(
  Food_ID INT,
  Food_Name VARCHAR(50)
);

INSERT INTO T VALUES (1,'lettuce');
INSERT INTO T VALUES (2,'lettuce');
INSERT INTO T VALUES (3,'lettuce');
INSERT INTO T VALUES (4,'tomato');
INSERT INTO T VALUES (5,'tomato');
INSERT INTO T VALUES (6,'pick');
INSERT INTO T VALUES (7,'pick');

查询1

select t1.[Food_ID]
      ,t1.[Food_Name]
      ,t1.[Amount]
      ,t1.Duplicate_Value 
from(
    SELECT *
      ,COUNT(*) over(partition by Food_Name order by Food_Name) as Duplicate_Value
      ,ROW_NUMBER() over(partition by Food_Name order by Food_ID) as rn
    FROM [Foodie].[dbo].[Food]
) t1
where t1.rn = 1

Results

| Food_ID | Food_Name | Duplicate_Value | rn |
|---------|-----------|-----------------|----|
|       1 |   lettuce |               3 |  1 |
|       6 |      pick |               2 |  1 |
|       4 |    tomato |               2 |  1 |

答案 3 :(得分:0)

SELECT t.Food_Name,MIN(t.Food_ID) AS Food_ID,COUNT(t.Food_ID) AS Duplicate_Value
FROM [Food] AS t
GROUP BY t.Food_Name