2017-04-01 6 views
0
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"열은 집계 함수 또는 GROUP BY 절에 포함되어 있지 않으므로 ORDER BY 절에서 유효하지 않습니다.이 오류가 발생하는 이유는 무엇입니까?

+0

을 바로 가리키는 네하지만 어떤 문제가 있습니까? –

답변

0

당신은 마지막에서 행 앞뒤에서 집계 열 SUM(Amount) Amount 대신 e.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 
0

UNION ALLTOP 같은 진술은 각각 Common Table Expressions에 넣고 그 다음에 UNION ALL을 넣을 수 있습니다.

그래서 이런 일을 수행 할 수 있도록 다른 CTEUNION ALL을 포장 할 수 있지만 다른 더 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을 수행하십시오.

관련 문제