无法在任何地方找到这个问题......我有这样的陈述:
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语句的集合列表中。
答案 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,或者在需要数据时动态计算。