使用DISTINCT选择COUNT(*)

586

我在SQL Server 2005中有一个名为cm_production的表,该表列出了所有已投入生产的代码。该表具有ticket_numberprogram_typeprogram_namepush_number等列以及其他一些列。

目标:按程序类型和推送编号计算所有不同的程序名称。

到目前为止,我所拥有的是:

DECLARE @push_number INT;
SET @push_number = [HERE_ADD_NUMBER];

SELECT DISTINCT COUNT(*) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

这让我有些进展,但它在计算所有程序名称,而不是不同的程序名称(我不指望查询会做到这一点)。我猜我只是无法理解如何告诉它仅计算不同的程序名称而不选择它们。

8个回答

985
统计所有按程序类型和推送编号区分的不同程序名称数量。
SELECT COUNT(DISTINCT program_name) AS Count,
  program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type
DISTINCT COUNT(*)会对每个唯一的计数返回一行。你需要的是COUNT(DISTINCT <expression>):它会对分组中的每一行计算表达式的唯一、非空值,并返回这些值的数量。

1
唯一(Unique)不等于不同(Distinct)。 不同指的是与其他值不同的值。它可以有重复项,我们可以使用DISTINCT来删除它们。另一方面,唯一的值仅存在一次,它们没有重复项。 - Paweł Szmajda

182

我需要获取每个唯一值的出现次数。该列包含地区信息。 我最终使用的简单SQL查询语句是:

SELECT Region, count(*)
FROM item
WHERE Region is not null
GROUP BY Region

这将给我一个类似于以下列表:

Region, count
Denmark, 4
Sweden, 1
USA, 10

嘿@Netsi1964,使用相同的查询,但我想要区域、州和计数,这可能吗?请帮帮我。 - user7918630

95

你需要为不重复的列创建一个派生表,然后从该表中查询计数:

SELECT COUNT(*) 
FROM (SELECT DISTINCT column1,column2
      FROM  tablename  
      WHERE condition ) as dt

这里的dt是一个衍生表。


1
谢谢!我在很多数据库中使用了很多SQL,但这是我第一次将其标识为临时表并加上“as X”。 - Mmm
9
请注意,“dt”在此处的正常术语是“派生表”,而不是临时表。 - 8forty

27
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

distinct 必须放在 count 的括号内,谢谢。 - Kyle Burkett

17

可以尝试这样做:

SELECT
    COUNT(program_name) AS [Count],program_type AS [Type]
    FROM (SELECT DISTINCT program_name,program_type
              FROM cm_production 
              WHERE push_number=@push_number
         ) dt
    GROUP BY program_type

2
您可以尝试以下查询。
SELECT column1,COUNT(*) AS Count
FROM tablename where createddate >= '2022-07-01'::date group by column1

0
在SQL Server 2005中,要按程序类型和推送数量计算不同的程序名称,可以使用子查询首先选择不同的程序名称,然后在外部查询中执行计数。以下是一个示例查询,应该能够给您所需的结果:
DECLARE @push_number INT;
SET @push_number = [HERE_ADD_NUMBER];

SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type]
FROM (
    SELECT DISTINCT program_name, program_type
    FROM cm_production
    WHERE push_number = @push_number
) AS subquery
GROUP BY program_type;

在这个查询中,子查询根据指定的push_number从cm_production表中选择不同的节目名称和节目类型。然后,在外部查询中,您对不同的节目名称进行计数,并按节目类型分组结果。
顺便说一句,使用dbForge Studio for SQL Server,您可以轻松编写、执行和分析SQL查询。

-1

这是一个很好的例子,您想要获取存储在地址字段末尾的邮政编码计数

SELECT DISTINCT
    RIGHT (address, 6),
    count(*) AS count
FROM
    datafile
WHERE
    address IS NOT NULL
GROUP BY
    RIGHT (address, 6)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接