2009-01-05 41 views
22

Tôi có một câu lệnh chọn với các cột được tính toán và tôi muốn sử dụng giá trị của một cột được tính toán trong một cột khác. Điều này có thể không? Đây là một ví dụ giả tạo cho thấy những gì tôi đang cố gắng làm.Tham chiếu SQL Server một Cột được Tính

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25 
+1

Tôi đang ở trong cùng một thuyền .. Hell SQL server .. MS Access có thể thực hiện việc này.Và người dùng doanh nghiệp của chúng tôi có thể tính toán một cái gì đó bạn đã nói trong câu hỏi và tự hỏi tại sao tôi không thể làm trong SQL. –

Trả lời

20

số

Tất cả các kết quả của một hàng duy nhất từ ​​một chọn là nguyên tử. Nghĩa là, bạn có thể xem tất cả chúng như thể chúng xảy ra song song và không thể phụ thuộc vào nhau.

Nếu bạn đang đề cập đến cột được tính toán, thì bạn cần phải cập nhật đầu vào của công thức cho kết quả để thay đổi trong khi chọn.

Hãy suy nghĩ về các cột được tính là macro hoặc chế độ xem mini, tính một chút phép tính bất cứ khi nào bạn gọi.

Ví dụ, các cột này sẽ giống hệt nhau, luôn luôn:

-- assume that 'Calc' is a computed column equal to Salaray*.25 
SELECT Calc, Salary*.25 Calc2 FROM YourTable 

Cũng nên nhớ rằng tùy chọn persisted không thay đổi bất kỳ điều này. Nó giữ giá trị xung quanh đó là tốt đẹp cho lập chỉ mục, nhưng nguyên tử không thay đổi.

0

Bạn không thể "đặt lại" giá trị của cột được tính toán trong mệnh đề Chọn, nếu đó là những gì bạn đang cố gắng làm ... Giá trị của cột được tính toán dựa trên công thức cột được tính toán. CÓ THỂ bao gồm giá trị của cột được tính toán khác .... nhưng bạn có thể đặt lại các công thức trong mệnh đề Chọn ... nếu tất cả những gì bạn muốn làm là "đầu ra" giá trị dựa trên hai cột được tính toán, (như cú pháp trong câu hỏi đọc" Sau đó, '[calcval2]'
trong

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25 

sẽ chỉ trở thành một bí danh cột trong đầu ra của Select khoản.

hoặc là bạn hỏi làm thế nào để xác định công thức cho một cột được tính toán dựa trên một cột khác?

3

Hai cách tôi có thể nghĩ đến làm việc đó đi. Đầu tiên hiểu rằng cột calval1 không tồn tại như xa như SQL Server là có liên quan cho đến khi tuyên bố đã chạy, do đó nó không thể được sử dụng trực tiếp như thể hiện ví dụ của bạn. Vì vậy, bạn có thể đặt phép tính trong đó hai lần, một lần cho calval1 và một lần là thay thế cho calcval1 trong phép tính calval2. Một cách khác là để tạo ra một bảng có nguồn gốc với calval1 trong đó và sau đó tính toán calval2 ngoài một cái gì đó bảng có nguồn gốc như:

select calcval1*.25 as calval2, calval1, field1, field2 
from (select casestament as cavlval1, field1, field2 from my table) a 

Bạn sẽ cần phải kiểm tra cả hai cho hiệu suất.

11

Đáng tiếc là không thực sự, nhưng một workaround đó là đôi khi giá trị của nó là

SELECT [calcval1], [calcval1] * .25 AS [calcval2] 
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever) 
+0

điều này làm việc cho tôi mặc dù bạn có thể kết thúc với khá sâu làm tổ nếu có nhiều bước khác nhau trong tính toán của bạn. –

1

Bạn nên sử dụng một bên ngoài áp dụng thay vì một subselect:

select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V 
Các vấn đề liên quan