Вычисляемый столбец SQL Server с использованием группы по

Я пытаюсь создать вычисляемый столбец, используя 3 столбца из отдельной таблицы, сгруппированной по внешнему ключу в SSMS. У меня есть таблица ссылок OrderLines, которая связывает таблицы Orders и Products. Таблица OrderLines содержит RowID (PK), ItemPrice, Quantity и OrderID (FK). Таблица Orders содержит первичный ключ OrderID и представляет собой таблицу, в которую я хотел бы добавить столбец SubTotal. Итак, мне нужна формула ((ItemPricexQuantity), сгруппированная по OrderID), но я не могу найти решение.

Таблица строк заказов

Таблица заказов

Я понял, как получить его в виде столбца с помощью запроса и могу создать его с помощью представления, но мне было интересно, можно ли его добавить в таблицу «Заказы» в качестве вычисляемого столбца.

Запрос заключается в том, что создает нужный мне столбец:

Select orderid, SUM(itemprice*Quantity)
from orderitems
group by orderID

Спасибо за ваше время, Стивен


person Stephen    schedule 26.07.2018    source источник
comment
Добро пожаловать в Stack Overflow. Чтобы мы могли вам помочь, нам необходимо иметь возможность копировать и вставлять схемы таблиц и данные из вашего вопроса. Это невозможно с картинками. Пожалуйста, найдите время, чтобы прочитать эти две ссылки, а затем рассмотрите возможность редактирования своего вопроса, если вы все еще ищете помощь. stackoverflow.com/help/how-to-ask и, что касается размещения изображений, meta.stackoverflow.com/a/285557/5790584   -  person Eric Brandt    schedule 26.07.2018


Ответы (2)


Обсуждение ранее: i">Как указать вычисляемые столбцы в таблице, основанные на другом столбце в SQL Server?

create table orderitems 
(
orderId int,
itemid int,
productId int,
itemprice decimal(18,2),
quantity int
)
GO
create table orders
(
orderId int,
shipAmount decimal(18,2),
TaxAmount decimal(18,2)
)
GO
insert into orderitems (orderId,itemid,productId,itemprice,quantity) values
(1,1,2,1199,1),
(2,2,8,489.99,1),
(3,3,1,2517,1),
(3,4,9,415,1),
(4,5,2,1199,1),
(5,6,10,299,1),
(6,7,10,299,1)
GO
insert into orders (orderId,shipAmount,TaxAmount) values
(1,5,58.71),
(2,5,58.72),
(3,10,58.73),
(4,10,58.74),
(5,5,58.75),
(6,5,58.76);
GO
select * from orders
GO
orderId | shipAmount | TaxAmount
------: | :--------- | :--------
      1 | 5.00       | 58.71    
      2 | 5.00       | 58.72    
      3 | 10.00      | 58.73    
      4 | 10.00      | 58.74    
      5 | 5.00       | 58.75    
      6 | 5.00       | 58.76    
create function udfMyTable (@orderID  as int)
returns decimal(18, 2)
as
begin
  declare @res as decimal(19, 2);

  Select
    @res = SUM(itemprice*Quantity)
  from orderitems
  where
    orderID = @orderID    

return @res;
end
GO
alter table orderitems add SubTotal as dbo.udfMyTable(orderID)
GO
alter table orders add SubTotal as dbo.udfMyTable(orderID)
GO
Select * from orderitems
GO
orderId | itemid | productId | itemprice | quantity | SubTotal
------: | -----: | --------: | :-------- | -------: | :-------
      1 |      1 |         2 | 1199.00   |        1 | 1199.00 
      2 |      2 |         8 | 489.99    |        1 | 489.99  
      3 |      3 |         1 | 2517.00   |        1 | 2932.00 
      3 |      4 |         9 | 415.00    |        1 | 2932.00 
      4 |      5 |         2 | 1199.00   |        1 | 1199.00 
      5 |      6 |        10 | 299.00    |        1 | 299.00  
      6 |      7 |        10 | 299.00    |        1 | 299.00  
select * from orders
GO
orderId | shipAmount | TaxAmount | SubTotal
------: | :--------- | :-------- | :-------
      1 | 5.00       | 58.71     | 1199.00 
      2 | 5.00       | 58.72     | 489.99  
      3 | 10.00      | 58.73     | 2932.00 
      4 | 10.00      | 58.74     | 1199.00 
      5 | 5.00       | 58.75     | 299.00  
      6 | 5.00       | 58.76     | 299.00  

db‹>скрипка здесь

person 2SRTVF    schedule 26.07.2018
comment
Большое спасибо за помощь. Созданный вами код не группировался по OrderID, как вы можете видеть по OrderID 3. Из вашего кода я смог создать вторую функцию для группировки и получить правильный столбец SubTotal в таблице заказов. create function udfMyTable2 (@orderID as int) returns decimal(18, 2) as begin declare @res as decimal(19, 2); Select @res = SUM(subtotal) from orderitems where orderID = @orderID group by OrderID return @res; end Еще раз спасибо. - person Stephen; 26.07.2018

Я думаю, вам нужно что-то ниже

select  O.orderID ,sum(itemprice*Quantity)Orders O inner join OrderLines ol 
on O.OrderID=ol.OrderId
group by  O.OrderID
person Zaynul Abadin Tuhin    schedule 26.07.2018