2011-05-20 61 views
4

我试图计算天数之间的价格变化百分比。由于日子不是连续的,我在查询中建立一个计算字段,告诉我它是哪一天(第1天,第2天等)。为了今天与昨天进行比较,我在子查询中将计算的天数减1。我想要做的是在计算的相对日期中加入内部和外部查询。我想出的代码是:Sql服务器 - 使用计算字段联接子查询

SELECT TOP 11 
     P.Date, 
     (AVG(P.SettlementPri) - PriceY)/PriceY as PriceChange, 
     P.Symbol, 
     (RANK() OVER (ORDER BY P.Date desc)) as dayrank_Today 
FROM OTE P 
    JOIN (SELECT TOP 11 
       C.Date, 
       AVG(SettlementPri) as PriceY, 
       (RANK() OVER (ORDER BY C.Date desc))+1 as dayrank_Yest 
      FROM OTE C 
     WHERE C.ComCode = 'C-' 
     GROUP BY c.Date) C ON dayrank_Today = C.dayrank_Yest 
WHERE P.ComCode = 'C-' 
GROUP BY P.Symbol, P.Date 

如果我尝试和执行查询,我得到的指示dayrank_Today是无效的列的埃罗消息。我曾尝试将其重命名,排除它,嘲笑它,并让我蹲下。仍然是一个错误。

+0

你用什么db? SQL服务器? – 2011-05-20 01:10:51

+0

理解你的问题有点困难。你能否给我们提供表格结构(仅适用于相关领域),输入数据,期望的查询结果?理想情况下,您需要提供创建表的脚本并使用示例数据填充它们。 – 2011-05-20 01:13:50

+2

@ M.R .:'TOP'是SQL Server; 'RANK'表示SQL Server 2005+ – 2011-05-20 01:17:37

回答

2

您无法选择计算列,然后在连接中使用它。您可以使用热膨胀系数,这我不太熟悉,或者你可以仅仅指刚做表中选择像这样:

 

SELECT 
    P.Date,  
    (AVG(AvgPrice) - C.PriceY)/C.PriceY as PriceChange, 
    P.Symbol,  
    P.dayrank_Today FROM 
(SELECT TOP 11 
     ComCode, 
     Date, 
     AVG(SettlementPri) as AvgPrice, 
     Symbol, 
     (RANK() OVER (ORDER BY Date desc)) as dayrank_Today 
FROM OTE WHERE ComCode = 'C-') P 
    JOIN (SELECT TOP 11 
       C.Date, 
       AVG(SettlementPri) as PriceY, 
       (RANK() OVER (ORDER BY C.Date desc))+1 as dayrank_Yest 
      FROM OTE C 
     WHERE C.ComCode = 'C-' 
     GROUP BY c.Date) C ON dayrank_Today = C.dayrank_Yest 
GROUP BY P.Symbol, P.Date 

 
+0

M.R.感谢您的快速响应。我试过你的代码,但不幸的是得到一个错误说PriceY不能被绑定。 – GoingBaldBySql 2011-05-20 11:17:35

+0

M.R.我新使用Stackoverflow,所以我把事情搞砸了一点。我提供了更多信息,我编辑你的回复。如果那是做错事的方法,请让我知道。 – GoingBaldBySql 2011-05-20 11:38:23

+0

@GoingBaldBySql - 最好是更新你的问题,而不是编辑这个答案。但是,请不要删除现有的代码并明确表示您对此答案作出了响应。 – ChrisF 2011-05-20 11:39:18

1

如果可能的话可以考虑使用CTE,因为它使得它很容易。像这样的:

With Raw as 
(
    SELECT TOP 11 C.Date, 
    Avg(SettlementPri) As PriceY, 
    Rank() OVER (ORDER BY C.Date desc) as dayrank 
    FROM OTE C WHERE C.Comcode = 'C-' 
    Group by C.Date 
) 

select today.pricey as todayprice , 
yesterday.pricey as yesterdayprice, 
(today.pricey - yesterday.pricey)/today.pricey * 100 as percentchange 
from Raw today 
left outer join Raw yesterday on today.dayrank = yesterday.dayrank + 1 

显然这不包括符号,但可以很容易地包括该符号。 如果使用“与”语法没有按;吨满足您还可以使用计算字段与外部应用http://technet.microsoft.com/en-us/library/ms175156.aspx

虽然CTE将意味着你只需要编写自己的价格计算一次,这是很多清洁

干杯

3

我有同样的问题,发现这个线程,并找到了解决方案,所以我想我会在这里发布。

取代:

ON dayrank_Today = C.dayrank_Yest 

有:

ON (RANK() OVER (ORDER BY Date desc)) = C.dayrank_Yest 

而不是使用列名作为参数ON,复制给你摆在首位的colmun名字的声明

当然,由于违反了DRY,你不喜欢编程上帝,但你可以务实并提到评论中的重复,这应该使他们的愤怒得到温和的抱怨。

+0

谢谢,andyhasit,它适用于我。 – 2017-10-10 07:39:18