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)
语法是有效的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)
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)