Sql 这个查询有什么问题?为什么我会出现这个错误?
列“cte.Amount”在ORDER BY子句中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。您不能Sql 这个查询有什么问题?为什么我会出现这个错误?,sql,sql-server,tsql,Sql,Sql Server,Tsql,列“cte.Amount”在ORDER BY子句中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。您不能UNION ALL像这样的TOP语句,您可以将它们放在单独的公共表表达式中,然后UNION ALL这些语句中 因此,类似这样的情况,尽管您可能需要将UNION ALL包装到另一个CTE中,以便能够进一步执行另一个TOP 5 with cte as( Select Top 5 MenuItemName AS Name, Sum(Quantity) A
UNION ALL
像这样的TOP
语句,您可以将它们放在单独的公共表表达式中,然后UNION ALL
这些语句中
因此,类似这样的情况,尽管您可能需要将UNION ALL
包装到另一个CTE
中,以便能够进一步执行另一个TOP 5
with cte as(
Select Top 5 MenuItemName AS Name, Sum(Quantity) AS Quantity ,
Sum(Price) AS Amount
FROM [sTMS 3].dbo.Orders
INNER JOIN [sTMS 3].dbo.MenuItems ON [sTMS 3].dbo.Orders.MenuItemId = [sTMS 3].dbo.MenuItems.Id
INNER JOIN [sTMS 3].dbo.Tickets TCK ON TCK.Id = [sTMS 3].dbo.Orders.TicketId
INNER JOIN [sTMS 3].dbo.TicketEntities TEN ON TEN.Ticket_Id = TCK.Id
WHERE
(MenuItems.GroupCode = 'Rides' OR MenuItems.GroupCode = 'Ticket Rides')
AND Orders.CreatedDateTime BETWEEN Convert(DATETIME,'Jan 1 2017 12:00AM',101) and Convert(DATETIME,'Mar 3 2017 12:00AM',101)
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Master Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Technical Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Guest Card"}%'
Group by MenuItemName
Order by Amount Desc UNION ALL
Select Top 5 MenuItemName AS Name, Sum(Quantity) AS Quantity ,
Sum(Price) AS Amount
FROM sTMS10.dbo.Orders
INNER JOIN sTMS10.dbo.MenuItems ON sTMS10.dbo.Orders.MenuItemId = sTMS10.dbo.MenuItems.Id
INNER JOIN sTMS10.dbo.Tickets TCK ON TCK.Id = sTMS10.dbo.Orders.TicketId
INNER JOIN sTMS10.dbo.TicketEntities TEN ON TEN.Ticket_Id = TCK.Id
WHERE
(MenuItems.GroupCode = 'Rides' OR MenuItems.GroupCode = 'Ticket Rides')
AND Orders.CreatedDateTime BETWEEN Convert(DATETIME,'Jan 1 2017 12:00AM',101) and Convert(DATETIME,'Mar 3 2017 12:00AM',101)
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Master Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Technical Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Guest Card"}%'
Group by MenuItemName
Order by Amount Desc)
Select top 5 Name,Sum(Quantity) AS Quantity,Sum(Amount)/``
(Select SUM(Amount) FROM (Select top 5 Sum(e.Amount) Amount From cte e Group by e.Name order by e.Amount desc)a) * 100 AS Percentage,Sum(Amount) AS Amount
,CONVERT(DATETIME,'Jan 1 2017 12:00AM',101) FromDate
,CONVERT(DATETIME,'Mar 3 2017 12:00AM',101) ToDate
From cte Group by Name order by Amount desc
但是,最好从您的CTE
中删除TOP5
限制,只需执行UNION ALL
,然后在外部查询中执行TOP5
。您只需按e.Amount
排序,而不是最后一行第四行的聚合列SUM(Amount)Amount
:
WITH FirstTop5 AS
(
SELECT TOP 5
MenuItemName AS Name
, SUM(Quantity) AS Quantity
, SUM(Price) AS Amount
FROM [sTMS 3].dbo.Orders
INNER JOIN [sTMS 3].dbo.MenuItems
ON [sTMS 3].dbo.Orders.MenuItemId = [sTMS 3].dbo.MenuItems.id
INNER JOIN [sTMS 3].dbo.Tickets TCK
ON TCK.id = [sTMS 3].dbo.Orders.TicketId
INNER JOIN [sTMS 3].dbo.TicketEntities TEN
ON TEN.Ticket_Id = TCK.id
WHERE (MenuItems.GroupCode = 'Rides'
OR MenuItems.GroupCode = 'Ticket Rides')
AND Orders.CreatedDateTime BETWEEN CONVERT(DATETIME, 'Jan 1 2017 12:00AM', 101) AND CONVERT(DATETIME, 'Mar 3 2017 12:00AM', 101)
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Master Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Technical Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Guest Card"}%'
GROUP BY MenuItemName
ORDER BY Amount DESC
)
, SecondTop5 AS
(
SELECT TOP 5
MenuItemName AS Name
, SUM(Quantity) AS Quantity
, SUM(Price) AS Amount
FROM sTMS10.dbo.Orders
INNER JOIN sTMS10.dbo.MenuItems
ON sTMS10.dbo.Orders.MenuItemId = sTMS10.dbo.MenuItems.id
INNER JOIN sTMS10.dbo.Tickets TCK
ON TCK.id = sTMS10.dbo.Orders.TicketId
INNER JOIN sTMS10.dbo.TicketEntities TEN
ON TEN.Ticket_Id = TCK.id
WHERE (MenuItems.GroupCode = 'Rides'
OR MenuItems.GroupCode = 'Ticket Rides')
AND Orders.CreatedDateTime BETWEEN CONVERT(DATETIME, 'Jan 1 2017 12:00AM', 101) AND CONVERT(DATETIME, 'Mar 3 2017 12:00AM', 101)
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Master Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Technical Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Guest Card"}%'
GROUP BY MenuItemName
ORDER BY Amount DESC
)
SELECT * FROM FirstTop5
UNION ALL
SELECT * FROM SecondTop5
是的,你指对了,但这有什么不对?
with cte as(
Select Top 5 MenuItemName AS Name, Sum(Quantity) AS Quantity ,
Sum(Price) AS Amount
FROM [sTMS 3].dbo.Orders
INNER JOIN [sTMS 3].dbo.MenuItems ON [sTMS 3].dbo.Orders.MenuItemId = [sTMS 3].dbo.MenuItems.Id
INNER JOIN [sTMS 3].dbo.Tickets TCK ON TCK.Id = [sTMS 3].dbo.Orders.TicketId
INNER JOIN [sTMS 3].dbo.TicketEntities TEN ON TEN.Ticket_Id = TCK.Id
WHERE
(MenuItems.GroupCode = 'Rides' OR MenuItems.GroupCode = 'Ticket Rides')
AND Orders.CreatedDateTime BETWEEN Convert(DATETIME,'Jan 1 2017 12:00AM',101) and Convert(DATETIME,'Mar 3 2017 12:00AM',101)
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Master Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Technical Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Guest Card"}%'
Group by MenuItemName
Order by Amount Desc UNION ALL
Select Top 5 MenuItemName AS Name, Sum(Quantity) AS Quantity ,
Sum(Price) AS Amount
FROM sTMS10.dbo.Orders
INNER JOIN sTMS10.dbo.MenuItems ON sTMS10.dbo.Orders.MenuItemId = sTMS10.dbo.MenuItems.Id
INNER JOIN sTMS10.dbo.Tickets TCK ON TCK.Id = sTMS10.dbo.Orders.TicketId
INNER JOIN sTMS10.dbo.TicketEntities TEN ON TEN.Ticket_Id = TCK.Id
WHERE
(MenuItems.GroupCode = 'Rides' OR MenuItems.GroupCode = 'Ticket Rides')
AND Orders.CreatedDateTime BETWEEN Convert(DATETIME,'Jan 1 2017 12:00AM',101) and Convert(DATETIME,'Mar 3 2017 12:00AM',101)
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Master Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Technical Card"}%'
AND TEN.EntityCustomData NOT LIKE '%{"Name":"Card Type","Value":"Guest Card"}%'
Group by MenuItemName
Order by Amount Desc)
Select top 5 Name,Sum(Quantity) AS Quantity,Sum(Amount)/``
(Select SUM(Amount) FROM (Select top 5 Sum(e.Amount) Amount From cte e Group by e.Name order by Amount desc)a) * 100 AS Percentage,Sum(Amount) AS Amount
,CONVERT(DATETIME,'Jan 1 2017 12:00AM',101) FromDate
,CONVERT(DATETIME,'Mar 3 2017 12:00AM',101) ToDate
From cte Group by Name order by Amount desc