Использование результата SELECT в другом SELECT - программирование
Подтвердить что ты не робот

Использование результата SELECT в другом 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;

Запрос состоит в том, чтобы дать результирующий набор для таблицы лидеров на основе GridView, и я хочу получить только среднее значение баллов, возраст которых меньше 3 месяцев. У меня есть это в двух частях, как вы можете видеть, и, очевидно, это приводит к ошибке, подобной этой.

Msg 4104, уровень 16, состояние 1, строка 2

Идентификатор с несколькими частями "NewScores.NetScore" не может быть связан.

Из-за этого AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett

Как мне сделать так, чтобы я мог использовать NewScores, поэтому я получаю только средний результат менее 3-х месяцев?

EDIT: используя ответы, предоставленные людьми, я решил это, используя соединение в правильном месте, и вот правильный запрос:

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
4b9b3361

Ответ 1

NewScores - это псевдоним для таблицы баллов - похоже, вы можете комбинировать запросы следующим образом:

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;

Ответ 2

То, что вы ищете, это запрос с предложением WITH, если ваш dbms поддерживает его. Тогда

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

Обратите внимание, что в первой половине нет ;. НТН.

Ответ 3

Вам не хватает таблицы NewScores, поэтому ее невозможно найти. Просто присоединитесь к этой таблице.

Если вы действительно хотите не присоединяться к нему напрямую, вы можете заменить NewScores.NetScore на SELECT NetScore FROM NewScores WHERE {conditions on which they should be matched}