【问题标题】:Can't use MIN, MAX etc. SQL Server 2012不能使用 MIN、MAX 等 SQL Server 2012
【发布时间】:2015-11-07 18:01:39
【问题描述】:

我有这样的疑问:

 select 
      FirstName, LastName, BirthDate,
      GETDATE() AS [Today],
      CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) AS [Age]
FROM
      Employees
WHERE CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) >=55
ORDER BY LastName ASC

我想找到最大、最小和平均年龄,我认为我可以做到,但显然我做不到。如何使这项工作?

 select 
     FirstName, LastName, BirthDate,
     GETDATE() AS [Today],
     CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) AS [Age],
     MIN (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT)
FROM
     Employees
WHERE 
     CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) >=55
ORDER BY 
     LastName ASC

错误:

消息 195,第 15 级,状态 10,第 5 行
'MIN' 不是可识别的内置函数名。

【问题讨论】:

  • “显然我不能”您是否收到任何信息,例如错误?
  • 是的,它现在显示:Msg 102, Level 15, State 1, Line 5 'MIN' 附近的语法错误。之前没有 MIN 函数..
  • 上一行后面少了一个逗号
  • 我加了一个昏迷,现在的错误是:Msg 195, Level 15, State 10, Line 5 'MIN' is not a known built-in function name.
  • 星号有什么原因吗?请发布您正在运行的确切 SQL...

标签: sql-server aggregate-functions


【解决方案1】:

这是我找到的解决方案。感谢大家的帮助!

SELECT
       MAX (CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT)) AS [The Biggest Age]
     , MIN (CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT)) AS [The Smallest Age]
     , AVG (CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT)) AS [The Average Age]
FROM
      Employees

【讨论】:

    【解决方案2】:
    select FirstName
         , LastName
         , BirthDate
         , GETDATE() AS [Today]
         , CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) AS [Age]
         , MIN (CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT))
    FROM  Employees
    GROUP BY FirstName
         , LastName
         , BirthDate
         , CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) 
    HAVING CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) >=55
    ORDER BY LastName ASC
    

    【讨论】:

    • Still... Msg 195, Level 15, State 10, Line 6 'MIN' 不是可识别的内置函数名称。
    • 在您的管理工作室中执行SELECT @@VERSION 并在此处显示结果。
    • Microsoft SQL Server 2012 - 11.0.2218.0 (X64) 2012 年 6 月 12 日 13:05:25 版权所有 (c) Windows NT 6.1 (Build 7601) 上的 Microsoft Corporation Enterprise Edition(64 位) : Service Pack 1) (Hypervisor)
    • @PirreLeSang 复制并准确地过去这个答案。您在原始问题中的问题是您缺少CAST 并选择了无效的MIN(date AS INT),它会给您您提到的错误消息。但是,没有任何逻辑上的理由不应该这样做
    • @Sam cd 我应该复制和粘贴哪个答案?你能写出正确的答案让我跑吗?
    【解决方案3】:

    对@MAli 答案的一些修改。您不需要 GETDATE() 在 GROUP BY 子句中,并且按您获得 MIN 的相同值进行分组只会给您相同的值。这应该是您的查询:

    SELECT FirstName,LastName,BirthDate,Today,Age,
           MIN(Age) OVER ()
    FROM (
        select FirstName
             , LastName
             , BirthDate
             , GETDATE() AS [Today]
             , CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) AS [Age]
        FROM  Employees
        GROUP BY FirstName
             , LastName
             , BirthDate 
        HAVING CAST (DATEDIFF (DD, BirthDate, GETDATE())/365.25 AS INT) >=55
        ) AS A
    ORDER BY LastName ASC
    

    【讨论】:

    • sry 但由于某种原因仍然相同,没有最小值或最大值 i.imgur.com/z44ejO2.png
    • @PirreLeSang 是的,这可能是因为生日相同的人通常年龄相同。我修好了它。立即尝试。
    • 还是什么都没有。也许我没有正确写出我需要的东西,因为我有点菜鸟,所以让我改写一下。是否可以像我一样计算年龄,并且在我计算年龄后显示最小的和最大的?我认为通过使用 MIN 我可以返回最年轻的。
    • 太棒了!非常感谢你,现在编辑不是可点击的:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多