gpt4 book ai didi

sql-server - 用于在层次结构的每个级别聚合成本的 SQL Server CTE

转载 作者:行者123 更新时间:2023-12-03 17:48:11 24 4
gpt4 key购买 nike

我无法弄清楚如何编写一个 CTE 来将成本从交易表汇总到自连接表,以便它会给出层次结构每个级别的总成本。我整理了一个非常简单的例子来说明这个问题。以下是 DDL 和插入脚本,因此您可以重现问题,如果您愿意帮助我:

CREATE TABLE [Items](
[ItemId] [int] IDENTITY(1,1) NOT NULL,
[ParentId] [int] NULL,
[ItemName] [varchar](100) NOT NULL,
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED
(
[ItemId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [Transactions](
[TransactionId] [int] IDENTITY(1,1) NOT NULL,
[ItemId] [int] NOT NULL,
[Amount] [money] NOT NULL,
CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED
(
[TransactionId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [Items] ON
GO
INSERT [Items] ([ItemId], [ParentId], [ItemName]) VALUES (1, NULL, N'Warehouse')
GO
INSERT [Items] ([ItemId], [ParentId], [ItemName]) VALUES (3, 1, N'Bin 1')
GO
INSERT [Items] ([ItemId], [ParentId], [ItemName]) VALUES (4, 1, N'Bin 2')
GO
INSERT [Items] ([ItemId], [ParentId], [ItemName]) VALUES (5, 3, N'Item 1.1')
GO
INSERT [Items] ([ItemId], [ParentId], [ItemName]) VALUES (6, 3, N'Item 1.2')
GO
INSERT [Items] ([ItemId], [ParentId], [ItemName]) VALUES (7, 4, N'Item 2.1')
GO
INSERT [Items] ([ItemId], [ParentId], [ItemName]) VALUES (8, 4, N'Item 2.2')
GO
SET IDENTITY_INSERT [Items] OFF
GO
SET IDENTITY_INSERT [Transactions] ON
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (1, 5, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (2, 5, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (3, 6, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (4, 6, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (5, 4, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (6, 7, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (7, 7, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (8, 8, 10.0000)
GO
INSERT [Transactions] ([TransactionId], [ItemId], [Amount]) VALUES (9, 8, 10.0000)
GO
SET IDENTITY_INSERT [Transactions] OFF
GO
ALTER TABLE [Items] WITH CHECK ADD CONSTRAINT [FK_Items_Items] FOREIGN KEY([ParentId])
REFERENCES [Items] ([ItemId])
GO
ALTER TABLE [Items] CHECK CONSTRAINT [FK_Items_Items]
GO
ALTER TABLE [Transactions] WITH CHECK ADD CONSTRAINT [FK_Transactions_Items] FOREIGN KEY([ItemId])
REFERENCES [Items] ([ItemId])
GO
ALTER TABLE [Transactions] CHECK CONSTRAINT [FK_Transactions_Items]
GO

这是我一直在研究的 CTE:

With cteAggregateCost
as
(
select i.itemId, i.ParentId, t.Amount
from Items i join Transactions t on i.ItemId = t.ItemId
union all
select i.itemId, i.ParentId, t.Amount
from Items i join cteAggregateCost c on i.ItemId = c.ParentId
join Transactions t on i.ItemId = t.ItemId
)
select i.ParentId, i.ItemId, i.ItemName, sum(Amount) As AggregateCost
from Items i left join cteAggregateCost c on i.ItemId = c.ItemId
group by i.ParentId, i.ItemId, i.ItemName

这是我得到的结果:

Bad Result

这是我希望得到的结果:

Hoped-for Result

如您所见,除了前两条线外,所有线都在工作,前两条线没有容器成本,只有它们包含的项目。

非常感谢您提供的任何指导!

最佳答案

你可以像这样使用递归CTE

;WITH temp AS 
(
SELECT i.*, sum(isnull(t.Amount,0)) AS Amount
FROM @Items i
LEFT JOIN @Transactions t ON t.ItemId = i.ItemId
GROUP BY i.ItemId, i.ParentId, i.ItemName
)
,cteAggregateCost
as
(
select i.ItemId, i.ItemId AS RootId, i.Amount
from temp i
union all
select i.ItemId, c.RootId, i.Amount
from cteAggregateCost c
INNER JOIN temp i ON i.ParentId = c.ItemId
)
select i.*, ca.TotalAmount
from @Items i
CROSS APPLY
(
SELECT Sum(cac.Amount) AS TotalAmount
FROM cteAggregateCost cac WHERE i.ItemId = cac.RootId
) ca
OPTION (MAXRECURSION 0)

演示链接:http://rextester.com/XMK96314

关于sql-server - 用于在层次结构的每个级别聚合成本的 SQL Server CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44106825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com