【问题标题】:Computed column specification - minimum value?计算列规范 - 最小值?
【发布时间】:2013-01-12 07:35:15
【问题描述】:

我在 SQL Server 中有一个表,并且有一列我想从其他三列(Vendor1、Vendor2 和 Vendor3)中计算最小值。我已经弄清楚如何对这些值求和,但不知道如何找到最小值 - 我不断收到一个错误,即聚合可能不会出现在计算列中。有没有简单的方法来解决这个问题?

【问题讨论】:

  • 向我们展示您的陈述(更新您的答案)
  • 是的 - 有一个功能 MIN - 显示您尝试过的内容。
  • @Randy 你不能在计算列中使用它。
  • 我们能看到导致这个错误的代码吗?

标签: sql sql-server aggregate minimum


【解决方案1】:

您可以使用CASE 表达式

CREATE TABLE T
  (
     Vendor1 INT,
     Vendor2 INT,
     Vendor3 INT,
     MinVendor AS CASE
          WHEN Vendor1 < Vendor2
               AND Vendor1 < Vendor3 THEN Vendor1
          WHEN Vendor2 < Vendor3 THEN Vendor2
          ELSE Vendor3
        END
  ) 

但有Vendor1 - 3 列可能表明您的表不在first normal form 中。

【讨论】:

    【解决方案2】:

    试试这个:

    CREATE FUNCTION dbo.MinOf3(@a int, @b int, @c int)
    RETURNS INT
    AS
    BEGIN
     RETURN (SELECT MIN(a) FROM (
                                SELECT @a a UNION ALL
                                SELECT @b  UNION ALL
                                SELECT @c
                                ) T(a)
             )
    END
    GO
    
    CREATE TABLE T(a1 int, a2 int, a3 int, a4 as dbo.MinOf3(a1, a2, a3))
    

    【讨论】:

    • RETURN (SELECT MIN(a) FROM (VALUES(@a),(@b),(@c)) T(a)) 如果 2008+
    • 顺便说一句,我 +1 编辑了超过 3 列,它可能比CASE 更易于管理,但计算列中的标量 UDF 将完全阻止表的任何并行计划,即使列没有被引用。 Mentioned here
    【解决方案3】:

    MIN 就像它所说的聚合。它在单个列的所有行中找到列的最小值。听起来您正在尝试做的是在每行中找到跨三列的最小值。 SQL 没有内置函数来执行此操作,但可以使用简单的 CASE 表达式来完成,正如 Martin SMith 已经展示的那样。

    您可能还想考虑使用视图而不是计算列,这样您也可以这样做。

    SELECT     OtherColumn,
                              (SELECT     MIN(Vendor) AS Expr1
                                FROM          (SELECT     Vendor1 AS Vendor
                                                        UNION ALL
                                                        SELECT     Vendor2
                                                        UNION ALL
                                                        SELECT     Vendor3)) AS VendorMimum
    FROM         Vendors
    

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多