繁体   English   中英

在SQL中计算表的子集的总和/平均值

[英]Calculating sums / averages across a subset of a table in SQL

我正在寻找一些SQL专业知识。 我正在通过首先汇总所有相关行,然后除以查询中的天数来计算平均值。

我无法让我的总和正常工作(所有行总和为0)。 有什么建议么? 谢谢!


CREATE TABLE [dbo].[intradayOHLC_Selected_Closing_Prices_Staging] (
[Ticker] varchar(50),
[Date] float,
[Date 250 Days Ago] float,
[Close] float
)

INSERT INTO [intradayOHLC_Selected_Closing_Prices_Staging] ([Ticker], [Date])
SELECT [Ticker], CONVERT(float,[DataDate])
FROM [FinData].[dbo].[Date_Ticker_Shell$]
WHERE [Date_Ticker_Shell$].[DataDate] between '01/2/2007' AND '10/26/2015'


UPDATE [intradayOHLC_Selected_Closing_Prices_Staging]
SET [Date 250 Days Ago]=CONVERT(float,[Date Calculations].[Date 250 Days Ago])
FROM [Date Calculations]
WHERE [intradayOHLC_Selected_Closing_Prices_Staging].[Date]=[Date Calculations].[Date]

UPDATE [intradayOHLC_Selected_Closing_Prices_Staging]
SET [Close]=[dailyOHLC].[Close]
FROM [dailyOHLC]
WHERE [intradayOHLC_Selected_Closing_Prices_Staging].[Date]=[dailyOHLC].[Date] And [intradayOHLC_Selected_Closing_Prices_Staging].[Ticker]=[dailyOHLC].[Ticker]

CREATE TABLE [dbo].[intradayOHLC_Selected_Closing_Prices] (
[Ticker] varchar(50),
[Date] float,
[Date 250 Days Ago] float,
[Close] float,
[Aggregated 250 Day Closing Prices] float,
[Average 250 Day Price] float
)

INSERT INTO [intradayOHLC_Selected_Closing_Prices] ([Ticker], [Date], [Date 250 Days Ago], [Close], [Aggregated 250 Day Closing Prices])
SELECT [Ticker], [Date], [Date 250 Days Ago], [Close],
SUM(CASE WHEN [Date] between [Date] AND [Date 250 Days Ago] THEN [Close] ELSE 0 END) [Aggregated 250 Day Closing Prices]
FROM [FinData].[dbo].[intradayOHLC_Selected_Closing_Prices_Staging]
GROUP BY [Ticker], [Date], [Date 250 Days Ago], [Close]

为什么将日期转换为数字? SQL Server具有非常好的日期函数和运算符。 您应该使用它们。

但是,我认为您的问题是between 假设[Date 250 Days Ago]早于[Date] ,则您的边界顺序错误。 between的第一个界限应小于第二个界限。

因此,请尝试:

SELECT [Ticker], [Date], [Date 250 Days Ago], [Close],
       SUM(CASE WHEN [Date] between [Date 250 Days Ago] AND [Date] 
                THEN [Close] ELSE 0 END) as [Aggregated 250 Day Closing Prices]
FROM [FinData].[dbo].[intradayOHLC_Selected_Closing_Prices_Staging]
GROUP BY [Ticker], [Date], [Date 250 Days Ago], [Close];

看到这一点,我认为您只需要GROUP BY中的[Ticker] 所以我猜你真的想要:

SELECT [Ticker],
       SUM(CASE WHEN [Date] between [Date 250 Days Ago] AND [Date] 
                THEN [Close] ELSE 0 END) as [Aggregated 250 Day Closing Prices]
FROM [FinData].[dbo].[intradayOHLC_Selected_Closing_Prices_Staging]
GROUP BY [Ticker]

非常感谢,戈登。 我按照您的建议清理了代码,但是现在我的总和正在整个Universe的所有日期中汇总,而不是我尝试在暂存表中引用的指定日期范围。

需要明确的是,我正在寻找每日滚动1年的平均值,因此我的最终输出将需要包含股票行情和日期,以便我每天每条股票获得1行(如果这样的话)。 您可以指向我的任何方向都太棒了! 谢谢

CREATE TABLE [dbo].[intradayOHLC_Selected_Closing_Prices_Staging] (
[Ticker] varchar(50),
[Date] datetime,
[Date 250 Days Ago] datetime,
[Close] float
)

INSERT INTO [intradayOHLC_Selected_Closing_Prices_Staging] ([Ticker], [Date])
SELECT [Ticker], [DataDate]
FROM [FinData].[dbo].[Date_Ticker_Shell$]
WHERE [Date_Ticker_Shell$].[DataDate] between '01/2/2007' AND '10/26/2015'

UPDATE [intradayOHLC_Selected_Closing_Prices_Staging]
SET [Date 250 Days Ago]=[Date Calculations].[Date 250 Days Ago]
FROM [Date Calculations]
WHERE [intradayOHLC_Selected_Closing_Prices_Staging].[Date]=[Date Calculations].[Date]

UPDATE [intradayOHLC_Selected_Closing_Prices_Staging]
SET [Close]=[dailyOHLC].[Close]
FROM [dailyOHLC]
WHERE [intradayOHLC_Selected_Closing_Prices_Staging].[Date]=[dailyOHLC].[Date] And [intradayOHLC_Selected_Closing_Prices_Staging].[Ticker]=[dailyOHLC].[Ticker]


CREATE TABLE [dbo].[intradayOHLC_Selected_Closing_Prices] (
[Ticker] varchar(50),
[Date] datetime,
[Date 250 Days Ago] datetime,
[Close] float,
[Aggregated 250 Day Closing Prices] float,
[Average 250 Day Price] float
)

INSERT INTO [intradayOHLC_Selected_Closing_Prices] ([Ticker],[Aggregated 250 Day Closing Prices])
SELECT [Ticker],
SUM(CASE WHEN [Date] between [Date 250 Days Ago] AND [Date] 
THEN [Close] ELSE 0 END) as [Aggregated 250 Day Closing Prices]
FROM [FinData].[dbo].[intradayOHLC_Selected_Closing_Prices_Staging]
GROUP BY [Ticker]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM