如何忽略日期的一部分来分组数据

时间:2017-01-17 14:30:02

标签: sql sql-server

我有以下查询可行,但对我来说似乎非常不整洁和低效。

我的表格有两列:TDate& Sales

TDate      Sales
2016-03-25     5
2016-03-24     8
2016-03-28     7
2016-04-21     2
2016-04-14     1

我想按年份和月份对数据进行分组,即我不关心日期的那一天。结果(下面的查询确实给出)是,

TDate         Sales
201603        20
201604        3

实现这一目标的最佳方法是什么?

select left(convert(nvarchar, TDate, 112),6), sum(Sales)
from mytbl
group by left(convert(nvarchar, TDate, 112),6) 
order by left(convert(nvarchar, TDate, 112),6) 

3 个答案:

答案 0 :(得分:2)

将日期转换为月份的第一天(任何静态日期)并进行分组

以下是使用java.lang.IllegalStateException at android.media.MediaPlayer._reset(Native Method) at android.media.MediaPlayer.reset(MediaPlayer.java:1236) at android.widget.VideoView.release(VideoView.java:549) at android.widget.VideoView.access$2300(VideoView.java:49) at android.widget.VideoView$6.surfaceDestroyed(VideoView.java:537) at android.view.SurfaceView.updateWindow(SurfaceView.java:581) at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:290) at android.view.View.dispatchDetachedFromWindow(View.java:9823) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2266) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3588) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3568) at android.view.ViewGroup.removeView(ViewGroup.java:3516) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:951) at android.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1123) at android.app.BackStackRecord.run(BackStackRecord.java:592) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426) at android.os.Handler.handleCallback(Handler.java:605) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

的一种方法
getFragmentManager.beginTransaction().remove(fragmentToBeRemoved).commit();

或使用EOMONTH

select dateadd(dd,1,eomonth(TDate,-1)) as Tdate,sum(sales) 
from mytbl
Group by dateadd(dd,1,eomonth(TDate,-1))
Order by Tdate

这将确保正确订购日期。在您的方法中,日期按字符串排序。这两种方法都适用于DATEFROMPARTS及以上

旧版本

select DATEFROMPARTS(year(TDate),month(TDate),1)) as Tdate,sum(sales) 
from mytbl
Group by DATEFROMPARTS(year(TDate),month(TDate),1))
Order by Tdate

答案 1 :(得分:2)

对我来说,你的查询还可以,但是,随着时间的推移,使用DATEPART代替字符串转换可能会更有效率。

试试这个:

select DATEPART(year, TDate) *100 + DATEPART(month, TDate), sum(Sales)
from mytbl
group by DATEPART(year, TDate) *100 + DATEPART(month, TDate)
order by DATEPART(year, TDate) *100 + DATEPART(month, TDate)

答案 2 :(得分:0)

将原始查询包装在派生表中以保存一些输入,并使其符合ANSI SQL:

select TDate, sum(Sales)
from
(
    select left(convert(nvarchar, TDate, 112),6) TDate, Sales
    from mytbl
) dt
group by TDate
order by TDate

这样你就不必三次写同一个表达式了! (即,更容易调整/维护。)

(同样的技巧可以用于问题的其他答案。)