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

csa*_*sab 17 sql t-sql sql-server

我有一个表,VehicleModelYear,包含列id,年份,品牌和模型.

以下两个查询按预期工作:

SELECT DISTINCT make, model
FROM VehicleModelYear

SELECT COUNT(DISTINCT make)
FROM VehicleModelYear
Run Code Online (Sandbox Code Playgroud)

但是,此查询不起作用

SELECT COUNT(DISTINCT make, model)
FROM VehicleModelYear
Run Code Online (Sandbox Code Playgroud)

很明显,答案是第一个查询返回的结果数,但只是想知道这个语法有什么问题或者为什么它不起作用.

Joh*_*Woo 36

COUNT()in SQL Server接受以下语法

COUNT(*)
COUNT(colName)
COUNT(DISTINCT colName)
Run Code Online (Sandbox Code Playgroud)

你可以有一个子查询,返回一套独特的make,并model可以与计数.

SELECT  COUNT(*)
FROM
        (
            SELECT  DISTINCT make, model
            FROM    VehicleModelYear
        ) a
Run Code Online (Sandbox Code Playgroud)

最后的"a"不是拼写错误.这是一个别名,没有它,SQL会给出错误ERROR 1248 (42000): Every derived table must have its own alias.


Yur*_*ter 18

尝试将它们组合到一个字段中:

SELECT COUNT(DISTINCT make + ' ' + model)
FROM VehicleModelYear
Run Code Online (Sandbox Code Playgroud)

  • 或者`FROM COUNT(DISTINCT CHECKSUM(make,model))FROM VehicleModelYear` (10认同)
  • 校验和更好,因为你不必担心铸造. (2认同)

ype*_*eᵀᴹ 5

语法是有效的SQL,但尚未在SQL-Server中实现.

尝试重写:

; WITH cte AS
  ( SELECT DISTINCT make, model
    FROM VehicleModelYear
  )
SELECT COUNT(*) AS total
FROM cte ; 
Run Code Online (Sandbox Code Playgroud)

要么:

; WITH cte AS
  ( SELECT COUNT(DISTINCT model) AS cnt
    FROM VehicleModelYear
    GROUP BY make
  )
SELECT SUM(cnt) AS total
FROM cte ; 
Run Code Online (Sandbox Code Playgroud)

要么:

; WITH cte AS
  ( SELECT NULL AS n
    FROM VehicleModelYear
    GROUP BY make, model
  )
SELECT COUNT(*) AS total
FROM cte ; 
Run Code Online (Sandbox Code Playgroud)

最后,修改了上面的第二个和第三个查询,没有子查询:

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 ;
Run Code Online (Sandbox Code Playgroud)

@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 ;
Run Code Online (Sandbox Code Playgroud)

要么:

; WITH cte AS
  ( SELECT DENSE_RANK() OVER(ORDER BY make, model) AS dr
    FROM VehicleModelYear
  )
SELECT MAX(dr) AS total
FROM cte ;
Run Code Online (Sandbox Code Playgroud)