2016-05-02 11 views
0

Ich erhalte den FehlerSQL-Fehler mit order by-Klausel

Die ORDER BY-Klausel ist ungültig, Ansichten, Inline-Funktionen, abgeleitete Tabellen, Unterabfragen und allgemeine Tabellenausdrücke, es sei denn, TOP oder FOR XML wird auch angegeben

für Code unten, A

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

Entfernen Sie einfach diesen 'ORDER BY Serial angeben müssen, Spent 'keine Verwendung von es in' Sub-Query' –

+0

Der Fehler ist selbsterklärend. Entfernen Sie die 'ORDER BY'-Klausel - das Sortieren einer Unterabfrage würde sich sowieso nicht auf die Reihenfolge des Ergebnisses auswirken. – Siyual

+0

Es wirkt sich dann auf die group by-Klausel aus. Soll ich das auch entfernen? –

Antwort

0

in den Kommentaren erwähnt, soll dies die Abfrage sein. Beachten Sie auch, dass Ihre GROUP BY-Klausel ebenfalls falsch ist. Sie haben umfassen viele Spalten in SELECT, die in GROUP erscheinen nicht

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

Danke. Es funktionierte. –

0

BY Wenn Sie ORDER BY in Sicht benötigen oder derived table Sie PERCENT

(SELECT TOP 100 PERCENT 

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

Ich habe es versucht, aber hat nicht funktioniert. Es zeigt den gleichen Fehler –

+0

Vielleicht lege ich die oberen Prozent an falscher Stelle. Die Idee ist, das für die SELECT zu haben, für die Sie ORDER BY haben. Das brauchst du für die Unterabfrage mit Alias ​​PRE – FLICKER

+0

habe ich meine Antwort bearbeitet – FLICKER