2013-02-12 49 views
1

我有一个表Patients它看起来像这样:SQL存储的值,并在同一个查询中使用它的另一个

PatientName DateOftest Eye  L1 L2 L3 L4  L5 
    ---------------------------------------------------------------- 
    Mike   17-02-2009  L  23 25 40 32  30 
    Mike   17-02-2009  R  25 30 34 35  24 
    Bill   08-03-2006  L  20 24 30 24  25 
    Bill   08-03-2006  R  18 25 27 30  24 

现在我的查询下面发现意味着

SELECT 
    PatientName, DateOfTest,  
    (MAX(L1) + MAX(L2) + MAX(L3) + MAX(L4) + MAX(L5))/4 as Mean, 
    SQRT(POW(L1 - Mean, 2) + POW(L2 - Mean, 2) + POW(L3 - Mean, 2) + POW(L4 - Mean, 2) + POW(L5 - Mean, 2)) AS Standard Deviation, 
    'Binocular' Eye 
FROM 
    Patients 
GROUP BY 
    PatientName, DateOfTest; 

上面的查询是错误的因为我没有存储的意思..是否有任何方法来存储意味着找出我的代码中的标准偏差..我问,因为我有很长的查询和更多的记录..

+0

什么是您想要的输出? – 2013-02-12 04:14:10

+0

它让我感到你可能会做更多的工作 - ['STDEV'](http://msdn.microsoft.com/zh-cn/library/ms190474.aspx)。此外,你的意思是计算是不正确的(你正在增加5个值,但除以4) – 2013-02-12 07:19:50

回答

2

要存储我并在您的查询中重复使用它,一种选择是使用Common Table Expression。您可以将CTE加入表格以使用计算的平均值多次。

我得承认,不明白下面的行...

SQRT(POW(L1-Mean,2)+POW(L2-Mean,2)+POW(L3-Mean,2)+POW(L4-Mean,2)+POW(L5-Mean,2)) 
as Standard Deviation, 'Binocular' Eye 

...但下面的查询显示了如何整合计算的平均成线,我认为可能需要还有一些额外的工作。

--This is the CTE to calculate the mean 
WITH Mean_CTE AS 
(
    SELECT PatientName, DateOfTest, 
    (MAX(L1) + MAX(L2) + MAX(L3) + MAX(L4) + MAX(L5))/4 AS [Mean] 
    FROM Patients 
    GROUP BY PatientName, DateOfTest 
) 
--This is the original query 
SELECT Patients.PatientName, Patients.DateOfTest, Mean_CTE.Mean AS Mean, 
    SQRT(POW(L1-Mean_CTE.Mean,2)+POW(L2-Mean_CTE.Mean,2)+POW(L3-Mean_CTE.Mean,2) 
    +POW(L4-Mean_CTE.Mean,2)+POW(L5-Mean_CTE.Mean,2)) as Standard Deviation, 
    'Binocular' Eye 
FROM Patients 
INNER JOIN Mean_CTE --This is where you join the two 
ON Patients.PatientName = Mean_CTE.PatientName 
    AND Patients.DateOfTest = Mean_CTE.DateOfTest 
GROUP BY Patients.PatientName, Patients.DateOfTest, Mean_CTE.Mean; 
相关问题