2010-07-16 23 views
8

ile seçilen sütun Çok farklı tablolardan veri seçtiğim ve kötü bir eski veri yapısıyla başa çıkabildiğim (karmaşık bir SQL) SQL deyim var, birkaç tane özel sahibim Değerlerini diğer sütunlardan gelen değerlere göre alan sütunlar. Şu anda CASE ifadelerle bu çözdük:WHERE deyiminde geçersiz sütun adı hatası, CASE

SELECT 
    ..., 
    CASE channel 
     WHEN 1 THEN channel_1 
     WHEN 2 THEN channel_2 
     ... 
     ELSE 0 
    END AS ChannelValue, 
    CASE channelu 
     WHEN 1 THEN channelu_1 
     WHEN 2 THEN channelu_2 
     ... 
     ELSE '0' 
    END AS ChannelWithUnit, 
    ... 
FROM 
    ... 
--rest of statement continues with multiple joins and where/and clauses... 

MS SQL Server Management Studio'da sorgu yürütme ve benim AS bentlerinde belirtilen gibi sütun adları listelenmektedir zaman beklediğiniz tüm sonuçlar elde ederler. Ancak, bazı nedenlerle koşullu değerleri bir WHERE deyiminde kullanmama izin verilmez. Ben sorgunun sonunda

AND ChannelValue > Limit * p.Percentage/100 

eklerseniz, ben

Msg 207, Level 16, State 1, Hat 152
Geçersiz sütun adı 'ChannelValue' diyerek o satırda bir hata alıyorum

Neden buna izin verilmiyor? Bunun yerine ne yapmalıyım?

cevap

11

o SELECT listede ilan bir takma ad kullanmak geçerlidir SQL deyimi sadece bir parçası ORDER BY deyimdir. Sorgunun diğer bölümleri için tüm CASE ifadesini tekrarlamanız ve bunu kabul etmek için optimiser'e güvenmeniz gerekir.

Eğer SQL2005 + kullanıyorsanız, bu sorunu önlemek için bazen okunabilirlikle yardımcı olan bir CTE kullanabilirsiniz.

WITH YourQuery As 
(

SELECT 
    Limit, 
    Percentage, 
    CASE channel 
     WHEN 1 THEN channel_1 
     WHEN 2 THEN channel_2 
     ... 
     ELSE 0 
    END AS ChannelValue, 
    CASE channelu 
     WHEN 1 THEN channelu_1 
     WHEN 2 THEN channelu_2 
     ... 
     ELSE '0' 
    END AS ChannelWithUnit, 
    ... 
FROM 
) 

select ... 
FROM YourQuery WHERE 
ChannelValue > Limit * Percentage/100 
7

ChannelValue sütun ismini aynı select seviyesinde kullanamazsınız.
select ürününü bir alt sorguya koymanız gerekir.

select .... 
from 
( 
your select query 
) as innerSelect 
where ChannelValue > Limit * p.Percentage/100 
2

Sen bir CTE kullanabilirsiniz -

WITH CTE AS 
(
SELECT 
    ..., 
    CASE channel 
     WHEN 1 THEN channel_1 
     WHEN 2 THEN channel_2 
     ... 
     ELSE 0 
    END AS ChannelValue, 
    CASE channelu 
     WHEN 1 THEN channelu_1 
     WHEN 2 THEN channelu_2 
     ... 
     ELSE '0' 
    END AS ChannelWithUnit, 
    ... 
FROM 
) 
SELECT * 
FROM CTE 
WHERE ChannelValue > Limit * p.Percentage/100 
-2
-- SOMETHING FROM ADVENTURE WORKS THIS WORKS AS THE ABOVE POSTER 
--- USING 'WITH CTE AS' 
-- MY ANSWER TO A QUERY 

WITH CTE AS 
(
SELECT HE.Gender AS [GENDER], HE.HireDate AS [HIREDATE],  HE.BirthDate AS [BIRTHDATE], 
CASE 
WHEN DATEPART(YY,[BIRTHDATE]) BETWEEN 1962 AND 1970 AND [GENDER] = 'M' AND DATEPART(YY,[HIREDATE]) > 2001 THEN 'MALE' 
WHEN DATEPART(YY,[BIRTHDATE]) BETWEEN 1972 AND 1975 AND [GENDER] = 'F' AND DATEPART(YY,[HIREDATE]) BETWEEN 2001 AND 2002 THEN 'FEMALE' 
ELSE 'NOTREQUIRED' 
END AS [RESULT] 
FROM [HumanResources].[Employee] AS HE 
) 
SELECT * 
FROM CTE 
WHERE [RESULT] <> 'NOTREQUIRED' -- GOT THIS TOO WORK NO FEMALES IN RESULT 
ORDER BY [RESULT] 
gibi bir şey
İlgili konular