在我的表中,我试图将重复的Food_Name
计数到另一个称为Duplicate_Value
的列中。
SELECT [Food_ID]
,[Food_Name]
,[Amount]
FROM [Foodie].[dbo].[Food]
我试图像这样计算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
答案 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)
您可以尝试将COUNT
和ROW_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