这个查询有什么问题,为什么我得到这个错误?
问题描述:
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.Amount”在ORDER BY子句中无效,因为它不包含在聚合函数或GROUP BY子句中。这个查询有什么问题,为什么我得到这个错误?
答
你只是通过e.Amount
订购,而不是在第四集合列SUM(Amount) Amount
从最后一排:
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
答
不能UNION ALL
的TOP
之类的语句,你可以把它们放在单独的Common Table Expressions
然后UNION ALL
那些。
所以这样的事情,虽然你可能需要包装的UNION ALL
在另一个CTE
能够做到又一TOP 5
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
然而,它可以更好地从你的CTE
,只是去掉TOP 5
限制做一个UNION ALL
,然后在你的外部查询中执行TOP 5
。
是的,你是指向右侧,但什么是错? –