MSSQL 30-60-90-120 天查询分组

Posted

技术标签:

【中文标题】MSSQL 30-60-90-120 天查询分组【英文标题】:MSSQL 30-60-90-120 day query grouping 【发布时间】:2016-04-07 12:53:43 【问题描述】:

我对 MSSQL 有点生疏,但我正在尝试编写一个查询以显示 30 天的库存变动。

简而言之,我使用不同的 datediff 参数运行了几次以下查询

SELECT * FROM InvMovements
Where EntryDate between DATEADD(day,datediff(DAY,0,GETDATE()) -30,0)
and
DATEADD(day,datediff(day,0,getdate()) - 0)
Order by EntryDate DESC

SELECT * FROM InvMovements
Where EntryDate between DATEADD(day,datediff(DAY,0,GETDATE()) - 60,0)
and
DATEADD(day,datediff(day,0,getdate()) -31,0)
Order by EntryDate DESC

我想达到的目的,即使它使用 s-s-rS 也是按单个查询分组的,因此结果集在其分组之下 30 60 90

不确定这在普通查询中是否可行,或者我是否需要使用 s-s-rS 和列单独查询。

感谢任何帮助

【问题讨论】:

不确定你在问什么。请提供一个例子,例如作为SQL Fiddle。 SELECT * FROM InvMovements Where EntryDate 在 DATEADD(day,datediff(DAY,0,GETDATE()) - 30,0) 和 DATEADD(day,datediff(day,0,getdate()) 之间, 0) 按 EntryDate DESC SELECT * FROM InvMovements 排序,其中 EntryDate 在 DATEADD(day,datediff(DAY,0,GETDATE()) - 60,0) 和 DATEADD(day,datediff(day,0,getdate()) -31 之间, 0) Order by EntryDate DESC InvMovements 表将有一个 StockCode、Price 和 Date 完美结果将是 0-30 31-60 61-90 StockCode、Price、Date StockCode、Price、Date StockCode、Price、Date StockCode、Price、Date StockCode , 价格, 日期股票代码, 价格, 日期 【参考方案1】:

我会得到 EntryDate 和今天之间的 DATEDIFF,除以 30INTERGER 化它为团体。然后加 1,因此 0 - 29 天 = 1,乘以 30 得到日期组。

SELECT * , 
(CAST(DATEDIFF(DAY, EntryDate, GETDATE()) / 30 as INTEGER) + 1) * 30 AS PERIOD 
FROM InvMovements
Order by EntryDate DESC

但不确定 mysql 的语法有什么不同。 :(

【讨论】:

【参考方案2】:
  declare @CurrentDate datetime = convert(date,GETDATE())
   ;with M(i,o) as (
        select * from (
        values (0,30),(31,60),(61,90),(91,120)) R(i,o)
    )
    select
    Period = convert(nvarchar,m.i)+'-'+convert(nvarchar,m.o),
     *
    FROM InvMovements
    Where EntryDate between DATEADD(day,-m.o,@CurrentDate)
                        and DATEADD(day,-m.i,@CurrentDate)+0.99995
    Order by EntryDate DESC 

【讨论】:

【参考方案3】:

这是一个快速代码示例,除以 30.41666666666667,因为它是 365 天除以 12 个月 TimeCreated = 时间戳

group by 将是 1 到 12 每一个是 30 天

在 MSSQL 上,当您 Cast as int 时,它只需要整数它不会四舍五入不确定 MYSQL 您可以通过 select cast(0.99 as int) 对其进行测试,您应该收到 0

 /****** Script for SelectTopNRows command from SSMS  ******/

SELECT sum(isnull(Quantity,1)) as QTY,cast(DATEDIFF(day,TimeCreated,getdate())/30.41666666666667 as int) Which30Days
  FROM [estimatelinedetail] left join  [estimate] on estimate.TxnID=estimatelinedetail.IDKEY

  where ItemRef_ListID ='800022B3-1567464337' and TimeCreated>= GETDATE()-365
  group by cast(DATEDIFF(day,TimeCreated,getdate())/30.41666666666667 as int)

【讨论】:

以上是关于MSSQL 30-60-90-120 天查询分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL存储过程分页查询--只支持MSSQL2005及以上

mssql数据库分页查询效率的一次体会

WPF Datagrid 打印 - 分组分页

MSSQL所有表中查找某个字段中的一个数据。100分悬赏

MySQL基础之?表连接约束外键分组分页排序唯一索引

R语言可视化分面图假设检验多变量分组t检验可视化多变量分组分面条形图(faceting bar plot)并添加显著性水平添加抖动数据点(jitter points)