SQL Server查询解决

bar*_*tek 1 sql t-sql database sql-server

我有一个数据库,其中有多个公司名称。我需要进行查询以查找:公司名称、条目数、最新条目的日期。

最好按最新条目的日期排序(但我什至可以在 Excel 中排序)

SELECT 
    /*this is the list of companies with distinct name */
    DISTINCT(K.COMPANY) AS company_name,
    /*where I count entries*/
    (SELECT COUNT(KK.COMPANIES) FROM COMPANIES KK 
     WHERE KK.COMPANY = K.company_name) AS company_count,
    /*where I try to get newest entry date*/
    (SELECT TOP 1 ENTRY_DATE FROM COMPANIES KKK 
     WHERE KKK.COMPANY = K.company_name 
     ORDER BY KKK.ENTRY_DATE DESC) AS company_date
FROM 
    COMPANIES K 
WHERE
    K.ENTRY_DATE > '20211004 00:00:00'  
ORDER BY
    K.ID_KAMSOFT DESC
Run Code Online (Sandbox Code Playgroud)

我收到错误:

无效的列名

在子查询中。基本上,子查询看不到条件中外部查询的数据xxx.COMPANY = K.company_name

它应该非常简单,但它不起作用。

Jay*_*esh 5

您不需要使用子查询,尝试直接GROUP BY

SELECT 
    K.COMPANY AS company_name,
    COUNT(1) AS company_count,
    MAX(ENTRY_DATE) AS company_date
FROM 
    COMPANIES K 
WHERE
    K.ENTRY_DATE > '20211004 00:00:00'   
GROUP BY    
    K.COMPANY
ORDER BY
    3 DESC
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的做法。不过,我不喜欢在“ORDER BY”中使用位置。因此“ORDER BY company_date DESC”。我也更喜欢使用“COUNT(*)”来计算行数,因为这是为此制定的语法。使用“COUNT(1)”,您实际上告诉 DBMS 每行创建一个常量 1,检查该常量是否为空,如果不是,则对该行进行计数。大量的工作,SQL Server 的优化器不会发现这是不必要的。为什么是1?为什么不使用 `COUNT(123)` 或 `COUNT('count this row')` 或 `COUNT('Kermit is a frog')` 来完成同样的事情;-) (4认同)