Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL内部联接无法从以前的日期获取更改_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL内部联接无法从以前的日期获取更改

SQL内部联接无法从以前的日期获取更改,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个包含以下数据的表格: TradeDate Stock BuySell DayClose -------------------------------------- 10-Dec-12 ABC 1 11 10-Dec-12 ABC 2 12 11-Dec-12 ABC 1 11.5 11-Dec-12 ABC 2 12.5 11-Dec-12

我有一个包含以下数据的表格:

TradeDate   Stock   BuySell   DayClose
--------------------------------------
10-Dec-12   ABC        1         11
10-Dec-12   ABC        2         12
11-Dec-12   ABC        1         11.5
11-Dec-12   ABC        2         12.5
11-Dec-12   DEF        1         15
11-Dec-12   DEF        2         16
我想查询2012年12月11日的特定日期,以获得以下输出:

Stock   Buy     Sell    Mid     Change
--------------------------------------
 ABC    11.5    12.5    12.0    0.5
 DEF    15      16      15.5    
由于DEF没有上一个日期的数据,因此其更改应为空

我创建了以下查询:

Select Stock, 
AVG(CASE BuySell WHEN 1 THEN DayClose END) AS 'Buy', 
AVG(CASE BuySell WHEN 2 THEN DayClose END) As 'Sell', 
Sum(DayClose/2) as 'Mid', 
Sum(Change/2) AS Change

FROM (
select t1.Stock, t1.BuySell, t1.DayClose, Sum(t1.DayClose - t2.DayClose) as Change 

FROM #myTable as t1 inner join #myTable as t2 on 
t1.Stock = t2.Stock

where 
t1.TradeDate = '2012-12-11'  AND 
t2.TradeDate = (SELECT TOP 1 TradeDate FROM #myTable WHERE TradeDate < '2012-12-11' ORDER BY TradeDate DESC)  

GROUP BY 
t1.Stock, t1.buysell, t1.dayclose ) AS P1 GROUP BY stock
但我无法获得所需的输出,而是

Stock         Buy         Sell      Mid     Change
--------------------------------------------------------------
abc           11.500000 12.500000   12.00000    1.00    
谁能告诉我哪里出了问题。我好像在这里迷路了

谢谢, 莫妮卡

试试这个:

SELECT   a.TradeDate
        ,a.stock
        ,SUM(CASE WHEN a.BuySell = 1 THEN a.DayClose ELSE 0 END) Buy
        ,SUM(CASE WHEN a.BuySell = 2 THEN a.DayClose ELSE 0 END) Sell
        ,SUM(a.DayClose) / 2 AS Mid
INTO    #temp
FROM    #mytable a
GROUP   BY a.TradeDate, a.stock


SELECT  t.*,
        t.Mid - previousRecord.Mid AS Change
FROM    #temp t
LEFT JOIN   
        #temp previousRecord ON 
        previousRecord.TradeDate = DATEADD(DAY, -1, t.TradeDate)
AND     previousRecord.stock = t.stock

DROP TABLE #temp
现在只需选择日期数据即可。

请尝试:

;WITH T1 as(
SELECT   a.TradeDate
        ,a.stock
        ,SUM(CASE WHEN a.BuySell = 1 THEN a.DayClose ELSE 0 END) Buy
        ,SUM(CASE WHEN a.BuySell = 2 THEN a.DayClose ELSE 0 END) Sell
        ,SUM(a.DayClose) / 2 AS Mid
FROM    #mytable a
GROUP   BY a.TradeDate, a.stock
)SELECT  t.*,
        t.Mid - PR.Mid AS Change
FROM    T1 t
LEFT JOIN   
        T1 PR ON 
        PR.TradeDate = DATEADD(DAY, -1, t.TradeDate)
AND     PR.stock = t.stock

您需要MySQL和SQL Server的解决方案吗?请指定如何计算Buy、Sell、Mid和change列。Hi-techdo,Mid=Buy+Sell/2表示任何日期,而change的计算结果为[buy2-Buy1+Sell2-Sell1]/2。因此,在示例中,结果1的Mid应该是12,对吗?在预期输出中,“ABC”的Mid是12.5,不应该是12点吗?嗨,使用你的建议使用啊,使用CTE的人会建议使用同样的技术@Monica请将此答案标记为已接受并给予techdo认可。@Monica很高兴听到。。。谢谢你,伙计:
SELECT   a.TradeDate
        ,a.stock
        ,SUM(CASE WHEN a.BuySell = 1 THEN a.DayClose ELSE 0 END) Buy
        ,SUM(CASE WHEN a.BuySell = 2 THEN a.DayClose ELSE 0 END) Sell
        ,SUM(a.DayClose) / 2 AS Mid
INTO    #temp
FROM    #mytable a
GROUP   BY a.TradeDate, a.stock


SELECT  t.*,
        t.Mid - previousRecord.Mid AS Change
FROM    #temp t
LEFT JOIN   
        #temp previousRecord ON 
        previousRecord.TradeDate = DATEADD(DAY, -1, t.TradeDate)
AND     previousRecord.stock = t.stock

DROP TABLE #temp
;WITH T1 as(
SELECT   a.TradeDate
        ,a.stock
        ,SUM(CASE WHEN a.BuySell = 1 THEN a.DayClose ELSE 0 END) Buy
        ,SUM(CASE WHEN a.BuySell = 2 THEN a.DayClose ELSE 0 END) Sell
        ,SUM(a.DayClose) / 2 AS Mid
FROM    #mytable a
GROUP   BY a.TradeDate, a.stock
)SELECT  t.*,
        t.Mid - PR.Mid AS Change
FROM    T1 t
LEFT JOIN   
        T1 PR ON 
        PR.TradeDate = DATEADD(DAY, -1, t.TradeDate)
AND     PR.stock = t.stock