这个查询有什么问题,为什么我得到这个错误?

问题描述:

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子句中。这个查询有什么问题,为什么我得到这个错误?

+0

是的,你是指向右侧,但什么是错? –

你只是通过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 ALLTOP之类的语句,你可以把它们放在单独的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