SELECT COUNT(DISTINCT… ) error on multiple columns?

后端 未结 3 2176
囚心锁ツ
囚心锁ツ 2021-02-12 19:18

I have a table, VehicleModelYear, containing columns id, year, make, and model.

The following two queries work as expected:

SELECT DISTINCT make, model
F         


        
相关标签:
3条回答
  • 2021-02-12 19:34

    The syntax is valid SQL but has not been implemented in 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:

    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 ;
    
    0 讨论(0)
  • 2021-02-12 19:37

    Try combining them into a single field:

    SELECT COUNT(DISTINCT make + ' ' + model)
    FROM VehicleModelYear
    
    0 讨论(0)
  • 2021-02-12 19:45

    COUNT() in SQL Server accepts the following syntax

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

    You can have a subquery which returns unique set of make and model that you can count with.

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

    The "a" at the end is not a typo. It's an alias without which SQL will give an error ERROR 1248 (42000): Every derived table must have its own alias.

    0 讨论(0)
提交回复
热议问题