2012-09-11 23 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