【问题标题】:SQL Server calculated column using group bySQL Server 使用 group by 计算列
【发布时间】:2018-07-26 03:03:29
【问题描述】:

我正在尝试使用 SSMS 中按外键分组的单独表中的 3 列创建计算列。我拥有的是一个名为 OrderLines 的链接表,它链接了 Orders 和 Products 表。 OrderLines 表包含 RowID(PK)、ItemPrice、Quantity 和 OrderID(FK)。 Orders 表包含 OrderID 的主键,是我要添加 SubTotal 列的表。所以我需要的公式是((ItemPricexQuantity)按OrderID分组)但我想不出一个解决方案。

OrderLines Table

OrdersTable

我已经弄清楚如何使用查询将其作为列获取,并且可以使用视图创建它,但我想知道是否可以将其作为计算列添加到 Orders 表中。

创建我需要的列的查询是:

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

感谢您的宝贵时间, 斯蒂芬

【问题讨论】:

  • 欢迎来到 Stack Overflow。为了让我们帮助您,我们需要能够从您的问题中复制和粘贴您的表架构和数据。用图片是不可能的。请花点时间阅读这两个链接,如果您仍在寻求帮助,请考虑编辑您的问题。 stackoverflow.com/help/how-to-ask 和,关于发布图片,meta.stackoverflow.com/a/285557/5790584

标签: sql-server group-by ssms calculated-columns


【解决方案1】:

之前的讨论:How do I Specify Computed Columns in a Table which are based on another Column in 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
订单号 |出货量 |税额 ------: | :--------- | :-------- 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
订单号 |项目编号 |产品编号 |商品价格 |数量 |小计 ------: | -----: | --------: | :-------- | --------: | :-------- 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
订单号 |出货量 |税额 |小计 ------: | :--------- | :-------- | :-------- 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小提琴here

【讨论】:

  • 非常感谢您的帮助。您创建的代码没有按 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 再次感谢您。
【解决方案2】:

我猜你需要下面的东西

select  O.orderID ,sum(itemprice*Quantity)Orders O inner join OrderLines ol 
on O.OrderID=ol.OrderId
group by  O.OrderID

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多