【问题标题】:Computation inside select statement选择语句内的计算
【发布时间】:2012-03-16 19:55:21
【问题描述】:

我有一个存储过程,我根据条件选择 10 个列。 SELECT col 1 - 10 WHERE date is between x and y 没什么特别的。选定的列之一包含一个位开关。我希望能够检查那个位开关,如果它的 1 基于一些数学将一个值分配给一个列,那么它会根据一些替代数学分配。

SELECT col1...col10 
FROM table a
WHERE getDate is BETWEEN x AND y

IF col5 = 1 THEN
   col10 = quantity - quantitysold
ELSE
   col10 = quantity - SUM(quantitysold, yearlyonhand) 

是基本思想。我试图做的事情是不是太离谱了?这似乎是一个足够简单的概念,我只是不知道如何使它工作。

我的另一个想法是创建一个处理计算的 udf,如果位开关为 1,则从 sproc 内部调用该函数,如果不是,则调用备用函数。不过,对于一个相对简单的概念来说,这似乎是一项异常大量的工作。

【问题讨论】:

  • 接受您之前提出的问题的答案!
  • 我很抱歉,我以为我这样做了。我已经回去并在适用的情况下这样做了。

标签: sql stored-procedures select


【解决方案1】:

我认为您正在寻找case 声明:

select col1, .... , 
      case col5 when 0 then ... 
                when 1 then ... , 
       col6, .... 
Where
   ...

【讨论】:

    【解决方案2】:

    这样的?

    update table
    set col10 = (case when col5 = 1 then quantity - quantitysold else quantity - quantitysold + yearlyonhand end)
    where getDate between x and y
    

    【讨论】:

    • 我不想更新表格。基本返回信息。唯一的旁注是我要返回的列之一需要计算。计算取决于表中位开关的值。如果开关为真,则退货总额将为数量 - 已售数量(今天),否则退货总额将为数量 - 已售数量(永远)。这更有意义吗?
    【解决方案3】:

    确保数量、数量等是表中的列,或者在需要时进行连接...

    SELECT
        col1...,
        CASE
            WHEN col5 = 1 THEN quantity - TotalSoldToday
            ELSE quantity - (TotalSoldToday + yearlyonhand) 
        END AS col10 
    LEFT JOIN
    (
        SELECT
            Sum(Quantity) as TotalSoldToday
        FROM
            table a
        WHERE
            Convert(Date, DateColumn) = Convert(Date, GETDATE())
    ) T on 1 = 1
    FROM
        table a
    WHERE
        DateColumn is BETWEEN x AND y
    

    【讨论】:

    • 它们是所选列表的一部分,无需加入。我将尝试这个解决方案,看看它是否有效。看起来不对劲,是我在 case 语句中的语法。
    • 对不起,我忘了提到使用的数量公式需要使用内置函数。基本上如果 switch = 1 数量 = dailylimit - 今天卖出了多少。所以像:数量 = col5 - count(totalsold) today
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多