2016-05-02 4 views
0

Я получаю ошибкуSQL ошибка с порядком по п

Поручения п недействительна в представлениях, встроенных функциях, производных таблиц, подзапросы, и общие выражения таблиц, если TOP или FOR XML не указан также

для кода ниже,

SELECT  MIDDLE.MODEL AS Model, 
        MIDDLE.MANUFACTURER AS Manufacturer, 
        {fn CONCAT(CAST(AVG(ABS(MIDDLE.AVG_YEAR)/365) as Decimal(10, 2)), ' Years')} AS AverageAge, 
        {fn CONCAT('$',CAST(SUM(MIDDLE.ACQCOST) as Decimal(15,2)))} AS TotalAcquistionCost, 
        {fn CONCAT('$',CAST(AVG(MIDDLE.ACQCOST) as Decimal(15,2)))} AS AverageAcquistionCost, 
        {fn CONCAT('$',CAST(SUM(MIDDLE.SUMofSPENT) as Decimal(15,2)))} AS TotalRepairCost, 
        {fn CONCAT('$',CAST(AVG(MIDDLE.SUMofSPENT) as Decimal(15,2)))} AS AverageRepairCost 
     FROM 

      (SELECT 
        PRE.Model AS MODEL, 
        PRE.Manufacturer AS MANUFACTURER, 
        PRE.Avg_Year AS AVG_YEAR, 
        PRE.AcqCost AS ACQCOST, 
        SUM(PRE.Spent) AS SUMofSPENT FROM 
      (SELECT 

        E.sn AS SerialNumber, 
        E.mdl AS Model, 
        DATEDIFF(year, E.acq, GETDATE()) AS Avg_Year, 
        E.cost AS AcqCost, 
        E.mfr AS Manufacturer, 
        FR.spent AS Spent 
        FROM rme_failrepair AS FR 


      INNER JOIN rme_endo AS E 
        ON FR.acq_id = E.acq_id 
        AND FR.en_sn = E.en_sn 
      WHERE E.mdl = @mdl 

        ORDER BY SerialNumber, Spent)AS PRE 
        GROUP BY PRE.SerialNumber) AS MIDDLE 
+1

Просто удалите этот 'ORDER BY SerialNumber, отработавшие 'не использовать его внутри' Sub-Query' –

+0

Ошибка не требует пояснений. Удалите предложение «ORDER BY» - заказы на подзапрос не повлияют на порядок результата. – Siyual

+0

Это повлияет на предложение group by. Должен ли я удалить это? –

ответ

0

Как уже упоминалось в комментариях, это должно быть запрос. Также обратите внимание, что предложение GROUP BY неверно. Вы должны включать в себя много столбцов в SELECT, которые не появляются в GROUP BY

SELECT  
     MIDDLE.MODEL AS Model, 
     MIDDLE.MANUFACTURER AS Manufacturer, 
     {fn CONCAT(CAST(AVG(ABS(MIDDLE.AVG_YEAR)/365) as Decimal(10, 2)), ' Years')} AS AverageAge, 
     {fn CONCAT('$',CAST(SUM(MIDDLE.ACQCOST) as Decimal(15,2)))} AS TotalAcquistionCost, 
     {fn CONCAT('$',CAST(AVG(MIDDLE.ACQCOST) as Decimal(15,2)))} AS AverageAcquistionCost, 
     {fn CONCAT('$',CAST(SUM(MIDDLE.SUMofSPENT) as Decimal(15,2)))} AS TotalRepairCost, 
     {fn CONCAT('$',CAST(AVG(MIDDLE.SUMofSPENT) as Decimal(15,2)))} AS AverageRepairCost 
FROM 
(
    SELECT 
     E.sn AS SerialNumber 
     E.mdl AS Model, 
     DATEDIFF(year, E.acq, GETDATE()) AS Avg_Year, 
     E.cost AS AcqCost, 
     E.mfr AS Manufacturer, 
     SUM(FR.Spent) AS SUMofSPENT 
    FROM rme_failrepair AS FR INNER JOIN rme_endo AS E 
     ON FR.acq_id = E.acq_id AND FR.en_sn = E.en_sn 
    WHERE E.mdl = @mdl 
    GROUP BY 
     E.sn, E.mdl, DATEDIFF(year, E.acq, GETDATE()), E.cost, E.mfr 
) AS MIDDLE 
+0

Спасибо. Это сработало. –

0

Если вам нужно ORDER BY ввиду или derived table, вам необходимо указать PERCENT

(SELECT TOP 100 PERCENT 

       E.sn AS SerialNumber, 
       E.mdl AS Model, ..... 
+0

Я пробовал, но не работал. Он показывает ту же ошибку –

+0

Возможно, я поставил верхний процент в неправильном месте. Идея заключается в том, что для SELECT, для которого у вас есть ORDER BY. Это необходимо для подзапроса с псевдонимом PRE – FLICKER

+0

Я отредактировал свой ответ – FLICKER