2012-03-16 114 views
0

我有一个存储过程,其中我根据条件选择了10个cols。没有什么奇特的只是SELECT col 1 - 10 WHERE date is between x and y。其中一个选定的列包含一个位开关。我希望能够检查该位切换,并且如果它根据一些数学给一个列赋值,或者根据一些替代数学赋值。在select语句中计算

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来处理计算,并在sproc内部调用该函数(如果位开关为1),如果不是,则为另一个函数。尽管这似乎是一个相对简单的概念工作量异常。

+0

接受上一个问题的回答! – 2012-03-16 19:57:46

+1

我很抱歉我认为我这样做了。我已经回去并在适用的情况下完成此项工作。 – SSISPissesMeOff 2012-03-16 20:02:00

回答

0

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

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

确保数量,quantitysold等都是从表列或做,如果需要加入...

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 
+0

它们是选定列表的一部分,不需要连接。我会尝试这个解决方案,看看它是否有效。它看起来像是什么东西,在我的病例陈述中是我的语法。 – SSISPissesMeOff 2012-03-16 20:03:34

+0

对不起,我忘记提及正在使用的数量公式需要使用内置函数。基本上如果开关= 1数量= dailylimit - 今天销售多少。所以像这样: quantity = col5 - count(totalsold)today – SSISPissesMeOff 2012-03-16 20:09:17

0

像这样?

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

我不想更新表格。基本上返回信息。唯一值得注意的是我返回的其中一列需要计算。计算取决于表中位开关的值。如果开关是真的,则返回的总数将是数量 - 数量上限(今天),否则返回的总数将是数量 - 数量上限(永久)。这是否更有意义? – SSISPissesMeOff 2012-03-16 20:20:39