2013-04-12 11 views
14

Verwendung So, hier ist meine AbfrageSELECT-Ergebnisses in einer anderen SELECT

SELECT 
    * 
FROM 
    Score AS NewScores 
WHERE 
    InsertedDate >= DATEADD(mm, -3, GETDATE()); 


SELECT 
    ROW_NUMBER() OVER(ORDER BY NETT) AS Rank, 
    Name, 
    FlagImg, 
    Nett, 
    Rounds 
FROM (
    SELECT 
     Members.FirstName + ' ' + Members.LastName AS Name, 
     CASE 
      WHEN MenuCountry.ImgURL IS NULL THEN 
       '~/images/flags/ismygolf.png' 
      ELSE 
       MenuCountry.ImgURL 
     END AS FlagImg, 
     AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett, 
     COUNT(Score.ScoreID) AS Rounds 
    FROM 
     Members 
     INNER JOIN 
     Score 
      ON Members.MemberID = Score.MemberID 
     LEFT OUTER JOIN MenuCountry 
      ON Members.Country = MenuCountry.ID 
    WHERE 
     Members.Status = 1 
    GROUP BY 
     Members.FirstName + ' ' + Members.LastName, 
     MenuCountry.ImgURL 
    ) AS Dertbl 
ORDER BY; 

Die Abfrage ist ein Ergebnis für eine Gridview-basierte Rangliste gesetzt zu geben und was ich will, ist nur auf den Durchschnitt der Noten zu erhalten, die weniger als 3 Monate alt. Ich habe dies in 2 Teilen, wie Sie sehen können und offensichtlich gibt es einen Fehler wie folgt.

Msg 4104, Ebene 16, Status 1, Zeile 2

Der mehrteilige Bezeichner "NewScores.NetScore" nicht gebunden werden konnte.

, die wegen dieser AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett

ist Wie kann ich es so machen, dass ich NewScores es verwenden kann, so bin ich nur den Durchschnitt der Noten immer weniger als 3 Monate alt?

EDIT: die Antworten Mit Menschen zur Verfügung gestellt ich es gelöst habe durch eine an der richtigen Stelle kommen mit und hier ist die richtige Abfrage:

SELECT ROW_NUMBER() OVER(ORDER BY NETT) AS Rank, Name, FlagImg, Nett, Rounds FROM (SELECT Members.FirstName + ' ' + Members.LastName AS Name, CASE WHEN MenuCountry.ImgURL IS NULL THEN '~/images/flags/ismygolf.png' ELSE MenuCountry.ImgURL END AS FlagImg, AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett, COUNT(NewScores.ScoreID) AS Rounds FROM Members INNER JOIN (SELECT * FROM Score WHERE InsertedDate >= DATEADD(mm, -5, GETDATE())) NewScores ON Members.MemberID = NewScores.MemberID LEFT OUTER JOIN MenuCountry ON Members.Country = MenuCountry.ID WHERE Members.Status = 1 GROUP BY Members.FirstName + ' ' + Members.LastName, MenuCountry.ImgURL) AS Dertbl ORDER BY Nett ASC 
+0

Ich kann dasselbe erreichen, indem ich die WHERE-Klausel am Ende mit der Datumsbedingung hinzufüge, aber ich würde auch gerne wissen, wie man das mit dem ausgewählten Alias ​​macht. – Pandepic

+0

Sie haben der Tabelle 'NewScores' nicht beigetreten, deshalb kann die Spalte' NetScore' nicht gefunden werden. –

+0

Ja, ich wusste diesen Teil, ich versuche herauszufinden, wie genau ich in dieser Abfrage mitmachen muss, damit es so funktioniert, wie ich es möchte, die Joins, die ich bisher versucht habe, sind fehlgeschlagen. – Pandepic

Antwort

21

NewScores ersetzen kann, ist ein Alias ​​für Spieltisch - es sieht aus wie Sie die Abfragen kombinieren können wie folgt:

SELECT 
    ROW_NUMBER() OVER(ORDER BY NETT) AS Rank, 
    Name, 
    FlagImg, 
    Nett, 
    Rounds 
FROM (
    SELECT 
     Members.FirstName + ' ' + Members.LastName AS Name, 
     CASE 
      WHEN MenuCountry.ImgURL IS NULL THEN 
       '~/images/flags/ismygolf.png' 
      ELSE 
       MenuCountry.ImgURL 
     END AS FlagImg, 
     AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett, 
     COUNT(Score.ScoreID) AS Rounds 
    FROM 
     Members 
     INNER JOIN 
     Score NewScores 
      ON Members.MemberID = NewScores.MemberID 
     LEFT OUTER JOIN MenuCountry 
      ON Members.Country = MenuCountry.ID 
    WHERE 
     Members.Status = 1 
     AND NewScores.InsertedDate >= DATEADD(mm, -3, GETDATE()) 
    GROUP BY 
     Members.FirstName + ' ' + Members.LastName, 
     MenuCountry.ImgURL 
    ) AS Dertbl 
ORDER BY; 
+1

Basiert auf seine ursprüngliche SQL hatte er "FROM Score AS NewScores" –

+0

Vielen Dank für die mir den richtigen Ort, um den Beitritt zu tun, ich habe das Problem jetzt gelöst. – Pandepic

0

Sie vermissen Tabelle NewScores, so dass es nicht sein kann, gefunden. Tritt einfach dieser Tabelle bei.

Wenn Sie wirklich vermeiden wollen es direkt verbinden Sie NewScores.NetScore mit SELECT NetScore FROM NewScores WHERE {conditions on which they should be matched}

5

Was Sie suchen nach einer Abfrage mit WITH Klausel, wenn Ihr dbms es unterstützt. Dann

WITH NewScores AS (
    SELECT * 
    FROM Score 
    WHERE InsertedDate >= DATEADD(mm, -3, GETDATE()) 
) 
SELECT 
<and the rest of your query> 
; 

Hinweis, dass es keine ; in der ersten Hälfte. HTH.

+0

Was Sie WITH-Klausel aufrufen, wird eigentlich als "Common Table Expression" bezeichnet. Es verhält sich ein wenig wie eine temporäre Tabelle, die nur während der Auswahl unten verfügbar ist. Es ist keine Antwort auf die Frage, aber ich stimme zu, dass dies die beste Lösung für die Situation des OP wäre. –

Verwandte Themen