某个时间段内没有值,以默认值补充

gunziyang 2014-03-26 10:01:57
要统计某个时间段内入职人员,按月分组,数据表t有in_date, name两列

select to_char(in_date, 'YYYY-MM') as in_month, count(*) from t where in_date >= to_date('2009-01-01', 'YYYY-MM-DD') group by in_month order by in_month

现在有个问题是,有的月份(例如2009年2月)并没有员工入职,因此查出来的结果可能是这样的
2009-01 3
2009-03 2

现在想让,如果没有员工入职的那个月份,就默认为0,如下
2009-01 3
2009-02 0
2009-03 2

请问应该如何写查询语句呢?谢谢
...全文
169 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianjixue1 2014-04-25
  • 打赏
  • 举报
回复
这个要先建立月份的临时表(一年12个月循环出来插数据),然后关联检索 因为没写过Oracle的SQL ,就不上代码了
gunziyang 2014-04-25
  • 打赏
  • 举报
回复
引用 7 楼 u014247189 的回复:
select to_char(in_date, 'YYYY-MM') as in_month, (case when count(*)>0 then count(*) else 0) from t where in_date >= to_date('2009-01-01', 'YYYY-MM-DD') group by in_month order by in_month 试试这样呢?
还是没出现
煜宸0088 2014-04-23
  • 打赏
  • 举报
回复
case when count(*)>0 then count(*) else 0 end 上面打错了
煜宸0088 2014-04-23
  • 打赏
  • 举报
回复
select to_char(in_date, 'YYYY-MM') as in_month, (case when count(*)>0 then count(*) else 0) from t where in_date >= to_date('2009-01-01', 'YYYY-MM-DD') group by in_month order by in_month 试试这样呢?
gunziyang 2014-04-23
  • 打赏
  • 举报
回复
还有没有别的办法?自己顶一个
bwangel 2014-04-02
  • 打赏
  • 举报
回复
你可以专门建一个日期表,或者系统里本来就有这个表(这种表很常见的,比如工作日表) 然后用它LEFT JOIN实际数据表
_小黑_ 2014-04-02
  • 打赏
  • 举报
回复
你可以 在 创建 表的时候 给 这个列 设置 默认值
zzyonepiece 2014-04-02
  • 打赏
  • 举报
回复
用存储过程实现? 还是程序简单的多
gunziyang 2014-04-02
  • 打赏
  • 举报
回复
有没有方法是直接用sql查询语句就解决问题的?
md5e 2014-03-26
  • 打赏
  • 举报
回复
一般简单的做法是通过程序来实现 先定义一个DataTable,里面只有一列in_month,数据保存2009-01 ,2009-02,2009-03,2009-04,......2009-12 然后与select to_char(in_date, 'YYYY-MM') as in_month, count(*) from t where in_date >= to_date('2009-01-01', 'YYYY-MM-DD') group by in_month order by in_month 得到的DataTable进行合并,合并字段为in_month 合并方法 protected DataTable MergeDataTable(DataTable dt1, DataTable dt2, string KeyColName,bool isMergeAll) { //合并列 DataTable ndt1 = dt1.Copy(); DataTable ndt2 = dt2.Copy(); ndt2.PrimaryKey = new DataColumn[] { ndt2.Columns[KeyColName] }; for (int i = 0; i < ndt2.Columns.Count; i++) { if (ndt2.Columns[i].ColumnName.ToLower().Trim() != KeyColName.ToLower().Trim()) { ndt1.Columns.Add(ndt2.Columns[i].ColumnName); } } //合并相同主键的数据 for (int i = 0; i < ndt1.Rows.Count; i++) { DataRow inrow = ndt2.Rows.Find(ndt1.Rows[i][KeyColName]); if (inrow != null) { for (int j = 0; j < ndt2.Columns.Count; j++) { if (ndt2.Columns[j].ColumnName.ToLower().Trim() != KeyColName.ToLower().Trim()) { ndt1.Rows[i][ndt2.Columns[j].ColumnName] = inrow[ndt2.Columns[j].ColumnName]; } } if (isMergeAll) { ndt2.Rows.Remove(inrow); } } } if (isMergeAll) { //合并不同主键的数据 for (int i = 0; i < ndt2.Rows.Count; i++) { DataRow row = ndt1.NewRow(); for (int j = 0; j < ndt2.Columns.Count; j++) { row[ndt2.Columns[j].ColumnName] = ndt2.Rows[i][ndt2.Columns[j].ColumnName]; } ndt1.Rows.Add(row); } } return ndt1; }

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧