【问题标题】:I have Calendar date, How can I bring closing in each date?我有日历日期,如何在每个日期结束?
【发布时间】:2020-02-13 06:00:22
【问题描述】:

我的日历日期介于“2020-01-01”和“2020-01-03”之间。如何在不使用联合的情况下将数量总和带到每个日期,我尝试了以下查询:

SELECT 
    Date,
    Sum(ILE.Quantity)
FROM 
    Calender C 
LEFT JOIN 
    [XYZ$Item Ledger Entry] ILE 
ON 
    C.Date <= Cast(ILE.[Posting Date] as Date )
WHERE 
    Date BETWEEN '2020-01-01' AND '2020-01-03'
GROUP BY 
    Date;

我希望我的结果如下所示

Date           Qty
01-01-2020  24550318.91
01-02-2020  24321291.58
01-03-2020  24526795.94

Select Date from Calendar C Where Date Between '2020-01-01'And '2020-01-03'

Select '2020-01-01'[Qty Till],Sum(ILE.Quantity)From[XYZ$Item Ledger Entry]ILE Where [Posting Date] <= '2020-01-01'
Select '2020-01-03'[Qty Till],Sum(ILE.Quantity) From[XYZ$Item Ledger Entry]ILE Where [Posting Date] <= '2020-01-02'
Select '2020-01-03'[Qty Till],Sum(ILE.Quantity) From[XYZ$Item Ledger Entry]ILE Where [Posting Date] <= '2020-01-03'

【问题讨论】:

  • 请求您共享输入和预期输出数据集。这样,社区就能更好地回答您的问题。

标签: sql sql-server sql-server-2008 sql-server-2014


【解决方案1】:

您的查询应该有效,但我相信您的情况可能相反。以下仅考虑过去这 3 天的条目:

C.Date <= Cast(ILE.[Posting Date] as Date)

如果您想要记录之前这些日期,那么您需要切换它:

Cast(ILE.[Posting Date] as Date) <= C.Date

如果要加快查询速度,请在[Posting Date] 列上创建索引:

CREATE NONCLUSTERED INDEX NCI_LedgerEntry_PostingDate ON [XYZ$Item Ledger Entry] ([Posting Date])

然后避免在比较中将值转换为日期(尽管引擎可能仍使用索引,但不确定):

ILE.[Posting Date] < DATEADD(DAY, 1, C.Date)

【讨论】:

  • 嗨有没有办法更快地执行这个查询
猜你喜欢
  • 2020-01-23
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2012-09-06
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多