2012-09-11 3 views
-2

У меня есть запрос:Ссылаясь на псевдоним вместо того, чтобы повторять расчет

SELECT [outer].*, 
     (total_pain_patients/NULLIF ((SELECT Sum(total_pain_patients) 
      FROM [topplansperprovider] 
      WHERE [outer].[INDEX_IMSID] = [INDEX_IMSID] 
      AND plan_rank BETWEEN 1 AND 10), 0)) * 100 AS PercentOf, 
     pm.*, 
     percentof * pm.score 
FROM  [topplansperprovider] AS [outer] 
left JOIN [payer Mapping] pm 
on lower([outer].Plan_Name_OR_Payment_Type)=lower(pm.[ims payer name]) 
WHERE INDEX_IMSID = '1753841' 
ORDER BY 6 ASC 

Моя проблема заключается в выборе этого:

percentof * pm.score 

Так как percentof это псевдоним производного столбца, я дон Не знаю, как использовать его в других столбцах.

  1. Как выбрать percentof * pm.score?
  2. Если это слишком сложно, как я могу добавить percentof в качестве постоянного столбца к моему столу?
+2

Не знаете, в чем состоят вопросы. Вы спрашиваете, как выбрать что-то. Но в запросе, который вы отправили, уже содержится его! – usr

+0

@usr Я переформулировал вопрос, потому что он не точно описывал проблему. –

ответ

6

Вы не можете использовать псевдоним, как это, вам придется обернуть запрос в другой выберите:

select x.*, x.percentof*x.pm.score newvalue 
from 
(
    SELECT [outer].*, 
      (total_pain_patients/NULLIF ((SELECT Sum(total_pain_patients) 
              FROM [topplansperprovider] 
              WHERE [outer].[INDEX_IMSID] = [INDEX_IMSID] 
                AND plan_rank BETWEEN 1 AND 10), 0)) * 100 PercentOf, 
      pm.* 
    FROM  [topplansperprovider] AS [outer] 
    left JOIN [payer Mapping] pm 
     on lower([outer].Plan_Name_OR_Payment_Type)=lower(pm.[ims payer name]) 
) x 
WHERE x.INDEX_IMSID = '1753841' 
ORDER BY 6 ASC 

псевдоним столбца, который вы вычисления percentof не доступен для использования в другой колонке, если не его используется в подзапросе.

+0

Он действительно мог сделать это, используя 'CROSS APPLY' ... – JNK

1

Хотя не лучший ответ, вы можете создать представление, чтобы иметь постоянный столбец в представлении.

3

Создать вид:

CREATE VIEW dbo.whatever 
AS 
    SELECT 
     t.*, -- NAME THESE COLUMNS!!! 
     PercentOf = (t.total_pain_patients/NULLIF ((SELECT Sum(t2.total_pain_patients) 
     FROM dbo.[topplansperprovider] AS t2 
     WHERE t2.[INDEX_IMSID] = t.[INDEX_IMSID] 
     AND t2.plan_rank BETWEEN 1 AND 10), 0)) * 100, 
     pm.* -- NAME THESE COLUMNS!!! 
    FROM dbo.[topplansperprovider] AS t 
    LEFT OUTER JOIN dbo.[payer Mapping] AS pm 
    ON LOWER(t.Plan_Name_OR_Payment_Type) = LOWER(pm.[ims payer name]) 
    WHERE t.INDEX_IMSID = '1753841'; 
GO 

Теперь ваш запрос может быть:

SELECT *, [something] = PercentOf * score -- NAME THIS ALIAS! 
    FROM dbo.whatever 
    ORDER BY 6 ASC; -- NAME THIS COLUMN!!! 

Однако, пожалуйста остановка используя ленивые SELECT * синтаксис, особенно с точки зрения:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick-using-select-omitting-the-column-list.aspx

И пожалуйста остановка используя ORDER BY [ordinal]:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/06/bad-habits-to-kick-order-by-ordinal.aspx

Это и вредные привычки, которые вызывают у вас боль в конце концов.

+0

Аарон, похоже, что они причиняют * вы * боль прямо сейчас. :-) – GilM

Смежные вопросы