带有Case语句的SQL Server Alter表

时间:2014-06-20 13:26:02

标签: sql sql-server sql-server-2012

无法在任何地方找到这个问题......我有这样的陈述:

select State=(CASE Discount
WHEN 0 THEN sum((Price * Quantity) * (1 + Discount)) 
ELSE sum((Price * Quantity) * (Discount)) end)
from Table1 where OrderID is not null group by Price, OrderID, Discount 
order by  OrderID

这是根据折扣列中是否有数字来计算总数,原因是它是0,然后我加1以防止总数被设置为0并且数字本身就是数字。另一个语句计算具有百分比的余数。现在这个语句很完美,但是我无法计算出Alter表或Update语句的顺序/语法,任何帮助都会很棒,欢呼:)这就是我到目前为止所拥有的:

Alter table Table1 add Total As 
(CASE Discount
WHEN 0 THEN sum((Price * Quantity) * (1 + Discount)) 
ELSE sum((Price * Quantity) * (Discount)) end)
from Table1 where OrderID is not null group by Price, OrderID, Discount     
order by OrderID

^^上面不喜欢“FROM”这个词

update Table1 Total = CASE Discount
WHEN 0 THEN sum((Price * Quantity) * (1 + Discount)) 
ELSE sum(Price * Quantity) * (Discount)) end
上面的

^^给出了这个错误 消息157,第15级,状态1,第1行 聚合可能不会出现在UPDATE语句的集合列表中。

2 个答案:

答案 0 :(得分:0)

解决了:

Create view ExtenededPriceView as:
select OrderID, EquipmentID, ExtendedPrice = 
(Case
WHEN 
(Discount = 0) THEN sum((UnitPrice * Quantity))
ELSE 
sum((1 - Discount) * UnitPrice) * Quantity END)
from Table1  where OrderID is not null 
group by Discount, Quantity, EquipmentID, OrderID

然后调用一个程序:

create procedure UpdateExtendedPrice as
update Table1 set Table1.ExtendedPrice = 
ExtenededPriceView.ExtendedPrice
from Table1 inner join ExtenededPriceView on    
Table1.EquipmentID = ExtenededPriceView.EquipmentID
where ExtenededPriceView.EquipmentID =
(select TOP 1 EquipmentID from ExtenededPriceView order by EquipmentID desc)

答案 1 :(得分:0)

我不太确定为什么你会想要创建一个视图,然后是一个程序,只是为了更新一个列。如果您要在整个代码中反复调用它,那么根据具体情况可能会有所帮助。但是,如果您只是在代码中的某个位置引用它,那么,只需使用此更新。

http://sqlfiddle.com/#!6/486a9/2

--Setup
CREATE TABLE Table1(
    ID INT,
    Discount FLOAT,
    Price FLOAT,
    Quantity INT,
    Total FLOAT
);

INSERT INTO Table1 (ID, Discount, Price, Quantity) VALUES (1, 0, 5, 5), (2, (1 - .15), 4.5, 3);

--Doing work.
UPDATE t SET Total = [State]
FROM Table1 t, (select ID, [State]=(CASE Discount
WHEN 0 THEN sum(Price * Quantity) 
ELSE sum(Price * Quantity * Discount) end)
from Table1 GROUP BY ID, Discount, Price) a
WHERE t.ID = a.ID;

--See the results.
SELECT * FROM Table1;

本质上,数据库将如何处理您所编写的内容,除非我不创建任何长期数据库对象并将其全部简化为一个查询。我清理了你的SELECT(现在很少用括号)。我还假设您的ID列是唯一的。如果ID是唯一的,我认为您不需要GROUP on Price。

但是,我认为,更好的解决方案是在INSERT上计算Total,或者在需要数据时动态计算。