我有以下表格:
CREATE TABLE [dbo].[Amounts](
[EmpID] [int] NULL,
[Amount] [smallmoney] NULL
)
GO
CREATE TABLE [dbo].[Employees](
[LastName] [varchar](30) NULL,
[FirstName] [varchar](20) NULL,
[LocationID] [int] NULL,
[EmpID] [int] IDENTITY(1,1) NOT NULL
)
GO
CREATE TABLE [dbo].[Locations](
[LocationID] [int] NOT NULL,
[City] [varchar](20) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (7, 4750.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (2, 15750.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (7, 18100.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (4, 21000.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (3, 18100.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (10, 41000.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (7, 25000.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (11, 21500.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (5, 9900.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (7, 95900.0000)
GO
INSERT [dbo].[Amounts] ([EmpID], [Amount]) VALUES (9, 55000.0000)
GO
SET IDENTITY_INSERT [dbo].[Employees] ON
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Andrews', N'Alex', 1, 1)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Brown', N'Barry', 1, 2)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Jones', N'Lee', 2, 3)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Kendal', N'David', 1, 4)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Birch', N'Eric', 1, 5)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Kircher', N'Lisa', 4, 6)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Williams', N'David', 1, 7)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Marshall', N'John', NULL, 8)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Howard', N'James', 2, 9)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'O''Donnell', N'Terry', 2, 10)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Smythe', N'Sally', 1, 11)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Donovan', N'Barbara', 4, 12)
GO
INSERT [dbo].[Employees] ([LastName], [FirstName], [LocationID], [EmpID]) VALUES (N'Wagner', N'Phil', 1, 13)
GO
SET IDENTITY_INSERT [dbo].[Employees] OFF
GO
INSERT [dbo].[Locations] ([LocationID], [City]) VALUES (1, N'Paris')
GO
INSERT [dbo].[Locations] ([LocationID], [City]) VALUES (2, N'Sydney')
GO
INSERT [dbo].[Locations] ([LocationID], [City]) VALUES (3, N'Chicago')
GO
INSERT [dbo].[Locations] ([LocationID], [City]) VALUES (4, N'London')
GO
我想生成由城市订购的XML,其首先包含最高总金额,然后嵌套在其中,每个员工(由总金额最高的人排序)然后在每个员工中嵌套他们的金额(最高的第一个)。
以下查询(相当复杂 - 请让我知道是否有更简单/更便宜的方式)给出正确的顺序,但我仍然坚持如何获得XML(元素)嵌套,如我所述。
;
WITH cte as
(
SELECT City,
FirstName,
LastName,
Amount,
SUM(Amount)OVER(PARTITION BY CONCAT(LastName, FirstName) ORDER BY CONCAT(LastName, FirstName) ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Total
FROM Locations l
INNER JOIN Employees e
ON l.LocationID = e.LocationID
INNER JOIN Amounts a
ON a.EmpID = e.EmpID
GROUP BY City, LastName, FirstName, Amount
)
SELECT City, FirstName,LastName,Amount
FROM cte
ORDER BY SUM(Total)OVER(PARTITION BY City ORDER BY Total DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) DESC, Total DESC, Amount DESC
答案 0 :(得分:0)
这是一个看起来更简单的查询,结果相同:
SELECT City,
FirstName,
LastName,
Amount
FROM Locations l
INNER JOIN Employees e
ON l.LocationID = e.LocationID
INNER JOIN Amounts a
ON a.EmpID = e.EmpID
GROUP BY City, LastName, FirstName, Amount
order by city,SUM(Amount)OVER(PARTITION BY CONCAT(LastName, FirstName) ORDER BY CONCAT(LastName, FirstName) ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) desc,Amount desc, firstname, lastname