2016-09-26 15 views
5

tôi cần phải tạo ra một cái gì đó như thế nàySử dụng IF trong phần SELECT của truy vấn

SELECT x.id 
    , x.name 
    , x.type 
    ,(
     IF x.type = 1 
     (SELECT SUM(Col1) FROM TableA WHERE ... etc) 
     ELSE IF x.type = 2 
     (SELECT SUM(Col2) FROM TableB WHERE ... etc) 
    ) AS Total 
FROM TableX as x 

Vì vậy, tôi đang cố gắng để chọn một truy vấn phụ khác nhau tùy theo giá trị của x.type

Wing

+2

Làm gì? Vui lòng đặt câu hỏi :) – gofr1

+0

Bạn không thể chọn nhiều hơn một cột từ truy vấn phụ ' –

+0

Xin lỗi tôi sẽ chỉnh sửa bài đăng – wingyip

Trả lời

1

Sử dụng CASE tuyên bố

SELECT x.id, 
     x.name, 
     x.type, 
     CASE 
     WHEN x.type = 1 THEN (SELECT Sum(Col1) 
           FROM TableA Where...) 
     WHEN x.type = 2 THEN (SELECT Sum(Col2) 
           FROM TableB Where ..) 
     END AS Total 
FROM TableX AS x 
2

Hãy thử sử dụng LEFT JOINCOALESCE. Sử dụng các điều kiện của bạn x.type để tham gia các bảng.

COALESCE (Transact-SQL): Đánh giá các đối số theo thứ tự và trả về giá trị hiện tại của biểu thức đầu tiên không đánh giá NULL. https://msdn.microsoft.com/en-us/library/ms190349.aspx

SELECT x.id 
    , x.name 
    , x.type 
    , COALESCE(SUM(TableA.Column), SUM(TableB.Column)) as column_xyz 
FROM TableX as x 
LEFT JOIN TableA ON x.type = 1 AND ... 
LEFT JOIN TableB ON x.type = 2 AND ... 

Bạn cũng có thể sử dụng CASE WHEN ... THEN ... thay vì COALESCE để xác định những cột để sử dụng.

1

Bạn có thể sử dụng CASE WHEN như dưới đây:

SELECT 
    x.id, 
    x.name, 
    x.type, 
    CASE 
     WHEN x.type = 1 THEN (SELECT SUM(A.Col1) FROM TableA A WHERE 1 = 1) 
     WHEN x.type = 2 THEN (SELECT SUM(B.Col2) FROM TableB B WHERE 1 = 1) 
     ELSE NULL END AS Total 
FROM 
    TableX as x 
1

Bạn có thể sử dụng case expression:

select t.* , 
      Case when t.type = 1 then (select sum(col1) ... TableA) 
         when t.type = 2 then (select sum(col2) ... TableB) 
      End as Total 
From tableX t 
0

Bằng cách sử dụng biến -

DECLARE @SumA INT = SELECT SUM(Col1) FROM TableA WHERE ... etc 
DECLARE @SumB INT = SELECT SUM(Col2) FROM TableB WHERE ... etc 

SELECT x.id 
    , x.name 
    , x.type 
    ,(CASE x.type 
     WHEN 1 THEN @SumA 
     WHEN 2 THEN @SumB 
     END 
    ) AS Total 
FROM TableX as x 

Chọn kiểu dữ liệu cho biến Sum cho phù hợp (nếu thập phân).

+0

Các truy vấn biến sẽ được chạy trước khi truy vấn chính được chạy hay chỉ khi chúng được gọi? – wingyip

+0

Nó phải được chạy trong một lô duy nhất. – p2k

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