简体   繁体   English

多列上的SELECT COUNT(DISTINCT ...)错误?

[英]SELECT COUNT(DISTINCT… ) error on multiple columns?

I have a table, VehicleModelYear, containing columns id, year, make, and model. 我有一个表,VehicleModelYear,包含列id,年份,品牌和模型。

The following two queries work as expected: 以下两个查询按预期工作:

SELECT DISTINCT make, model
FROM VehicleModelYear

SELECT COUNT(DISTINCT make)
FROM VehicleModelYear

However, this query doesn't work 但是,此查询不起作用

SELECT COUNT(DISTINCT make, model)
FROM VehicleModelYear

It's clear the answer is the number of results returned by the first query, but just wondering what is wrong with this syntax or why it doesn't work. 很明显,答案是第一个查询返回的结果数,但只是想知道这个语法有什么问题或者为什么它不起作用。

COUNT() in SQL Server accepts the following syntax SQL Server COUNT()接受以下语法

COUNT(*)
COUNT(colName)
COUNT(DISTINCT colName)

You can have a subquery which returns unique set of make and model that you can count with. 您可以拥有一个子查询,该子查询返回您可以计算的唯一一组makemodel

SELECT  COUNT(*)
FROM
        (
            SELECT  DISTINCT make, model
            FROM    VehicleModelYear
        ) a

The "a" at the end is not a typo. 最后的“a”不是拼写错误。 It's an alias without which SQL will give an error ERROR 1248 (42000): Every derived table must have its own alias . 它是一个别名,没有它,SQL将给出错误ERROR 1248 (42000): Every derived table must have its own alias

Try combining them into a single field: 尝试将它们组合到一个字段中:

SELECT COUNT(DISTINCT make + ' ' + model)
FROM VehicleModelYear

The syntax is valid SQL but has not been implemented in SQL-Server. 语法是有效的SQL,但尚未在SQL-Server中实现。

Try a rewrite: 尝试重写:

; WITH cte AS
  ( SELECT DISTINCT make, model
    FROM VehicleModelYear
  )
SELECT COUNT(*) AS total
FROM cte ; 

or: 要么:

; WITH cte AS
  ( SELECT COUNT(DISTINCT model) AS cnt
    FROM VehicleModelYear
    GROUP BY make
  )
SELECT SUM(cnt) AS total
FROM cte ; 

or: 要么:

; WITH cte AS
  ( SELECT NULL AS n
    FROM VehicleModelYear
    GROUP BY make, model
  )
SELECT COUNT(*) AS total
FROM cte ; 

And finally, the 2nd and 3rd query above modified, without subqueries: 最后,修改了上面的第二个和第三个查询,没有子查询:

SELECT DISTINCT
    SUM(COUNT(DISTINCT model)) OVER () AS total
FROM VehicleModelYear
GROUP BY make ;

SELECT DISTINCT COUNT(*) OVER () AS total
FROM VehicleModelYear
GROUP BY make, model ;

Late additions by @Alexander Fedorenko : @Alexander Fedorenko的后期补充:

SELECT TOP (1)
    SUM(COUNT(DISTINCT model)) OVER () AS total
FROM VehicleModelYear
GROUP BY make ;

SELECT TOP (1) COUNT(*) OVER () AS total
FROM VehicleModelYear
GROUP BY make, model ;

or: 要么:

; WITH cte AS
  ( SELECT DENSE_RANK() OVER(ORDER BY make, model) AS dr
    FROM VehicleModelYear
  )
SELECT MAX(dr) AS total
FROM cte ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM