2013-04-12 22 views
14

Vì vậy, đây là câu hỏi của tôiSử dụng kết quả SELECT trong một CHỌN

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; 

Truy vấn là để đưa ra một kết quả thiết lập cho một bảng dẫn dựa GridView và những gì tôi muốn là để chỉ nhận được mức trung bình của Điểm đó là ít hơn 3 tháng tuổi. Tôi có điều này trong 2 phần như bạn có thể thấy và rõ ràng là nó đưa ra một lỗi như thế này.

Msg 4104, Level 16, State 1, Line 2

Từ định đa phần "NewScores.NetScore" không thể bị ràng buộc.

Đó là vì điều này AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett

Làm thế nào để làm cho nó để tôi có thể sử dụng NewScores có vì vậy tôi chỉ nhận được mức trung bình của điểm số dưới 3 tháng tuổi?

EDIT: Sử dụng các câu trả lời người cung cấp tôi đã giải quyết nó bằng cách sử dụng một tham gia tại địa điểm chính xác và đây là truy vấn chính xác:

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

Tôi có thể thực hiện điều tương tự bằng cách thêm vào mệnh đề WHERE gần kết thúc với điều kiện ngày nhưng tôi cũng muốn biết cách thực hiện điều này bằng bí danh chọn. – Pandepic

+0

bạn chưa tham gia bảng 'NewScores' đó là lý do tại sao cột' NetScore' không thể được định vị. –

+0

Vâng tôi biết phần đó, tôi đang cố gắng tìm ra cách chính xác để tham gia nó trong truy vấn này để nó hoạt động theo cách tôi muốn, các kết nối mà tôi đã thử cho đến nay đã thất bại. – Pandepic

Trả lời

21

NewScores là một bí danh để bàn Điểm - có vẻ như bạn có thể kết hợp các truy vấn như sau:

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

Dựa trên SQL ban đầu của ông, ông đã "TỪ Điểm AS NewScores" –

+0

Cảm ơn bạn đã cho tôi thấy địa điểm chính xác để tham gia, tôi đã giải quyết được vấn đề ngay bây giờ. – Pandepic

0

Bạn đang thiếu bảng NewScores, vì vậy nó không thể là tìm. Chỉ cần tham gia bảng này.

Nếu bạn thực sự muốn tránh tham gia trực tiếp bạn có thể thay NewScores.NetScore với SELECT NetScore FROM NewScores WHERE {conditions on which they should be matched}

5

gì bạn đang tìm kiếm là một truy vấn với mệnh đề WITH, nếu dbms của bạn hỗ trợ nó. Sau đó,

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

Lưu ý rằng không có ; trong nửa đầu. HTH.

+0

Điều bạn gọi là mệnh đề WITH được gọi là "Biểu thức bảng chung". Nó hoạt động giống như một bảng tạm thời chỉ có sẵn trong lựa chọn dưới đây. Nó không phải là một câu trả lời cho câu hỏi, nhưng tôi đồng ý rằng đây sẽ là giải pháp tốt nhất cho tình hình của OP. –

Các vấn đề liên quan