【问题标题】:SQL Server query to solveSQL Server查询解决
【发布时间】:2021-12-05 10:18:10
【问题描述】:

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

最好按照最新输入的日期进行排序(但我什至可以在 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

我收到一个错误:

列名无效

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

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

【问题讨论】:

  • distinct(K.COMPANY) as company_name:您不能在子查询中使用别名。将K.company_name 更改为K.company
  • 一个 COMPANIES 表有多个具有相同 COMPANY_NAME 的行似乎存在严重缺陷。
  • 我知道,但是这家公司肯定是蚂蚁公司——这只是例子 :) 谢谢,所有输入
  • @Nikola Markovinović - 顺便说一句,你的解决方案也有效,我想我会创建这个采石场作为第二个答案,只是为了教育目的......或者你应该这样做,这样我就可以投票了?
  • 谢谢先生。 Bartek,我只是想帮你。我不再做答案了,但你可能会。

标签: sql sql-server database tsql


【解决方案1】:

你不需要使用子查询,直接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

【讨论】:

  • 这是正确的做法。不过,我不喜欢使用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') 会做同样的事情;-)
  • 我需要确认数据,但这完美无缺。我知道有简单的方法来做到这一点:)
  • @ThorstenKettner SQL Server 对COUNT(someconstant) 进行了特定优化,所以我真的不用担心
  • @Charlieface:我知道。但是为什么不正确地写呢? COUNT(*) 并不比 COUNT(1) 更难输入,也许 Jayasurya Satheesh 不知道 COUNT(expression) 的实际用途。现在他知道了:-)
【解决方案2】:

选择的答案显然更好,但这也可以:

(正如@Nikola Markovinović 所说,您只需使用非别名)

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) AS company_count,
    /*where I try to get newest entry date*/
    (SELECT TOP 1 ENTRY_DATE FROM COMPANIES KKK 
     WHERE KKK.COMPANY = K.COMPANY
     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

【讨论】:

  • 是的,这会起作用,而且绝对可怕。首先,DISTINCT(K.COMPANY) 可能使它看起来像 DISTINCT 是在 K.COMPANY 上调用的函数,但事实并非如此。这是一个适用于整个结果行的关键字。这意味着为了可读性,应该删除那些误导性的括号。查询所做的是读取表中的每一行,并为每一行执行两个子查询。最后它将应用DISTINCT,因此可能会删除您费力创建的 99% 的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多