Where 子句 (T-SQL) 中的财政年度迄今为止
Posted
技术标签:
【中文标题】Where 子句 (T-SQL) 中的财政年度迄今为止【英文标题】:Fiscal Year To-Date in Where Clause (T-SQL) 【发布时间】:2012-05-15 15:44:01 【问题描述】:公司会计年度:7 月 1 日 - 6 月 30 日
我有一个查询,我试图按产品和成本中心捕获本财年迄今为止的总单位数和收入美元。它将在每月 1 日运行,并查看上个月的最后一天。会计年度未出现在报告中 - 这是标准。
Mix of pseudocode and SQL:
Where
If datepart(mm,getdate()) - 1 < 7
THEN
transaction_post_date BETWEEN 7/1/ previous year AND dateadd(day,-(day(getdate()),getdate())
Else
transaction_post_date BETWEEN 7/1/current year AND dateadd(day,-(day(getdate()),getdate())
我在写轨道上吗?如何为取决于 SQL 的年份的特定日期编写 SQL - 7/1/当年?
我对变量的使用很弱,甚至不知道我是否有权在 SQL Server DB 上创建它们,这相当锁定。绝对不能创建函数。 (我是一名业务分析师。)
更新,财政年度向前推进,因此 2010 年 7 月 1 日是 2011 财政年度。
我认为这可行:
Year(dateadd(month,6,htx.tx_post_date)) = Year(DateAdd(Month, 5, GetDate()))
反馈?
现在我被要求将数量和收入的财政年初至今字段添加到以下查询中,该查询为我提供了总计
Select
inv.ITEM_CODE
, inventory.ITEM_NAME
, cc.COST_CENTER_CODE
, tx.REV_CODE_ID
, tx.PRICE
, tx.ITEM_SALE_ID
, sum(tx.quantity)
, sum(tx.amount)
from
transactions tx
inner join inventory inv on inv.item_id = tx.item_id
left outer join cost_center cc on cc.cost_center_id = tx.cost_center_id
where
DATEPART(mm, tx.tx_date) = DATEPART(mm,dateadd(m,-1,getdate()))
and DATEPART(yyyy, tx.tx_date) = DATEPART(yyyy,dateadd(m,-1,getdate()))
group by
inv.ITEM_CODE
, inventory.ITEM_NAME
, cc.COST_CENTER_CODE
, tx.REV_CODE_ID
, tx.PRICE
, tx.ITEM_SALE_ID
我需要在此报告中添加财政年度至今的数量和金额列。顺便说一下相关子查询吗?连接会很棘手吗?我从未将子查询与聚合/分组查询一起使用。
感谢您之前的所有帮助。
【问题讨论】:
了解的第一步是尝试一下。DECLARE @myVar AS INT
等应该没有问题。
您真的不想将BETWEEN
用于日期范围,尤其是在执行诸如月末/日终检查之类的事情时(最简单的方法是“不到 1st of下个月/一天的开始”,尤其是时间戳)。此外,尽管我的直觉告诉我有一种方法可以通过一组函数来实现这一点(不过,您可能需要自己定义一些),但您可能还是想考虑创建一个日历文件。
【参考方案1】:
如果我需要按会计年度分组,我会这样做:
Group by Year(DateAdd(Month, -6, TransactionDate))
可能不完全是这样,但你明白了。
【讨论】:
如果你需要特定日期范围的数据,为什么不把它放在像htx.tx_post_date between FiscalYearStart and FiscalYearEnd
这样的条件中呢?如果您需要按会计年度范围汇总,那是另一回事,那么您可以使用上面的分组。
抱歉,你是在跟我说话吗?因为我看不出你的陈述和我的评论之间的相关性,即使你所说的总体上是有道理的。我只是想稍微更正您的计算(即,如果一年的开始是在 7 月而不是 1 月,那么它会移动 6 个月,而不是 7)。
我需要两列(交易数量和交易金额)来查看最近一个月,比较容易。然后我需要在他们右边的财政年度迄今为止的两个字段中获得数字,每个分组内容有一条记录。
@texas_mike81:啊,好的,谢谢。我很困惑,因为系统会通知我该评论,就好像它是对我的回复一样。【参考方案2】:
我会在您的表中添加一个名为 FiscalYear 的计算列(使用适当的计算)并根据该列进行选择
【讨论】:
【参考方案3】:我相信最简单的方法是分两步完成。使用 WHERE 子句过滤您的 YTD,然后使用 GROUP BY 按 FY 分组。由于您的 FY 从 7 月 (7) 开始,因此如果月份大于 June(6),则增加 FY。
条款:
WHERE
DATEDIFF(DAY, transaction_post_date, Cast(Month(GetDate()) as varchar) +
'/' + Cast(Day(GetDate()) as varchar) + '/' + CAST(Case WHEN
MONTH(transaction_post_date) > 6 then YEAR(transaction_post_date) + 1 else
Year(transaction_post_date) end as varchar)) >=0
按条款分组:
GROUP BY CASE WHEN MONTH(transaction_post_date) > 6 then
Year(transaction_post_date) + 1 else YEAR(transaction_post_date) end
【讨论】:
以上是关于Where 子句 (T-SQL) 中的财政年度迄今为止的主要内容,如果未能解决你的问题,请参考以下文章