动态交叉表-统计每天员工生日数

(2010-8-27 记录)动态交叉表-统计每天员工生日数:

1.表结构

Emp ( id , empNo,empName,gender,birthday,deptId )

Dept(id,deptNo,deptName)

2.要点:

2.1 每月天数,计算两个月初的日期差即可;

2.2 小计和合计,利用 group by with ROLLUP

2.3 动态显示 1 号, 2 号, 3 号 …28 号, 29 号 … ,利用动态交叉表实现

3 .代码如下:

/**
    统计某月员工生日
*/

IF EXISTS (select * from sysobjects where id = object_id('sp_count_birthday') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
  DROP PROCEDURE sp_count_birthday
GO

CREATE Procedure sp_count_birthday
  @P_MONTH NVARCHAR(2)       --月份
WITH encryption
AS
BEGIN
  BEGIN TRANSACTION T1
  DECLARE @V_DAYS INT                 --当月天数
  DECLARE @V_FIRST_DAY_M NVARCHAR(10) --当月第一天
  DECLARE @V_YEAR NVARCHAR(4)         --当前年份
  DECLARE @V_SQL NVARCHAR(4000)       --最后执行的sql
  DECLARE @V_I INT                    --计数
  DECLARE @V_TOTAL NVARCHAR(10)       --合计
  DECLARE @V_SUBTOTAL NVARCHAR(10)    --小计

  SET @V_TOTAL = N'合计'
  SET @V_SUBTOTAL = N'小计'
  SET @V_YEAR = datepart(yyyy,GETDATE())
  SET @V_FIRST_DAY_M = @V_YEAR + '-' + @P_MONTH + '-' + '01'
  SET @V_DAYS = DATEDIFF(dd,@V_FIRST_DAY_M,DATEADD(mm,1,@V_FIRST_DAY_M)) 

  CREATE TABLE #tmp_date(emp_birth datetime)

  SET @V_I = 0
  WHILE(@V_I < @V_DAYS)
  BEGIN
    INSERT INTO #tmp_date(emp_birth) values (DATEADD(dd,@V_I,@V_FIRST_DAY_M))
    SET @V_I = @V_I + 1
  END
  SET @V_SQL = 'SELECT case when(grouping(org_dpt_name) = 1) then N''' + @V_TOTAL + ''' else isNULL(org_dpt_name, '''') end as ''' + N'部门' + ''',
                       case when(grouping(org_dpt_name) <> 1 and grouping(emp_sex) = 1) then N'''[email protected]_SUBTOTAL+'''  else isNULL(dbo.fun_get_lang(emp_sex,''pla_lan_001'',''1'') , '''' ) end as ''' + N'性别' + ''','
  select @V_SQL = @V_SQL + 'sum(case when right(CONVERT(NVARCHAR(8),emp_birth,112),4) = ''' + right(CONVERT(NVARCHAR(8),emp_birth,112),4) + ''' then 1 else 0 end) as ''' +
                            cast(datepart(d,emp_birth) as varchar(2)) + N'号' + ''',' from (select emp_birth from #tmp_date) a
  select @V_SQL = left(@V_SQL,len(@V_SQL)-1) + ' from emp_info e,org_dept d where e.emp_dptcd=d.org_dpt_levcd  group by org_dpt_name,emp_sex WITH ROLLUP order by org_dpt_name DESC,emp_sex DESC'
  --print @V_SQL
  exec(@V_SQL)
  IF @@ERROR > 0
  BEGIN
    ROLLBACK TRANSACTION T1
  END
  ELSE
  BEGIN
    COMMIT TRANSACTION T1
  END
END

GO

--EXEC sp_count_birthday '6'

动态交叉表-统计每天员工生日数

时间: 2024-12-31 02:36:40

动态交叉表-统计每天员工生日数的相关文章

交叉表、行列转换和交叉查询经典

交叉表.行列转换和交叉查询经典分类: SqlServer 2007-12-05 16:01 6776人阅读 评论(1) 收藏 举报sqlsqlserverinsertnull产品sql server交叉表.行列转换和交叉查询经典一.什么是交叉表“交叉表”对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: 行列摘要字段“交叉表”中的行沿水平方向延伸(从一侧到另一侧).在上面的示例中,“手套”(Gloves) 是一行.“交叉表”中的

Oracle错误:动态执行表不可访问,本会话自动统计被禁止,关闭自动统计之后的问题

使用PL/SQL时, 每次第一次打开表的时候会提示"动态执行表不可访问,本会话的自动统计被禁止"的错误,一消息如下: V$SESSION,V$SESSTAT,V$STATNAME没有被授权,没有权限访问这几张表,所以没有本法进行统计. 当然要给授权了.授权SQL如下: sqlplus /nolog 进入登录页面,然后执行conn /as sysdba   登录到sys用户 用SYS登录,授权给相应的用户,用下面的语句 grant select on v_$statname to sco

LSQL,第一次执行表的select操作的时候,提示&quot;动态执行表不可访问,本会话的自动统计被禁止&quot;

使用PLSQL,第一次执行表的select操作的时候,提示"动态执行表不可访问,本会话的自动统计被禁止" 这种问题,一看就是当前连接用户没有对sys用户下的表v$session,v$sesstat,v$statname的select权限 解决此问题的方式就是授权: 以sysdba身份登录 grant select on v_$statname to username;grant select on v_$sesstat to username;grant select on v_$se

PL\SQL 打开时出现&quot;动态执行表不可访问,本会话的自动统计被禁止&quot;

这个报错信息在不同的PL/SQL Developer版本都会出现,从上面详细的报错提示信息中我们可以判断得到,报错原因不在工具本身. 在此,详细记录一下这个小问题的三种处理方法. 1.第一种处理方法(不推荐) 就是在报错的Error对话框中将"Don't show this message again"选项选中,下次就不在提示这个错误了. 这种方法应该可以叫做"鸵鸟方式"的处理方法.没有从根本上解决这个问题. 2.第二种处理方法(可以采纳) 报错信息中描述的非常详细

PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案

PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案 2014-10-08 12:31:46 分类: Oracle PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案 现象: 第一次用PLSQL Developer连接数据库,若用sys用户登录并操作则正常,若用普通用户比如haishu登录并创建一个表则报错“动态执行表不可访问,本会话的自动统计被禁止.在执行菜单里你可以禁止统计,或在v$session,v$sesstat和

润乾集算报表非常规统计之固定行列交叉表

实际信息系统中很多数据计算是为前端展示而进行的,其中报表是最常见的一种形式.这些计算的实现过程往往并不简单,使用SQL或存储过程实现起来比较困难,从而影响到前端报表设计.像http://bbs.csdn.net/topics/390883416中提的问题,其目的是为了实现一个固定行列的交叉表,用SQL准备好固定行数的数据源很麻烦.而润乾集算报表则有很灵活的计算能力,可以充分利用问题特点应付各种非常规的计算需求.这里就以链接中业务为背景,给出集算报表实现某种固定列交叉报表的方案. 报表背景 源数据

转:关于PLSQL Developer报"动态执行表不可访问,本会话的自动统计被禁止"错的解决方法

这个报错信息在不同的PL/SQL Developer版本都会出现,从上面详细的报错提示信息中我们可以判断得到,报错原因不在工具本身. 在此,详细记录一下这个小问题的三种处理方法. 1.第一种处理方法(不推荐) 就是在报错的Error对话框中将"Don't show this message again"选项选中,下次就不在提示这个错误了. 这种方法应该可以叫做"鸵鸟方式"的处理方法.没有从根本上解决这个问题. 2.第二种处理方法(可以采纳) 报错信息中描述的非常详细

JasperReport报表开发之转置交叉表

使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如源数据不符合交叉表的要求,需要转置后再呈现.集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现此类需求.下面通过一个例子来说明转置交叉表的实现过程. 数据库表booking汇总着各年度商品的预定数据,有四个字段,包括年份和三种预定状态,部分数据如下: 报表要求呈现指定年份及上一年的预定情况,其中行组有三项,即三种预定状态,列组是年份,测度是当年的预定数据.此外要汇总出指定年份各预

数据分析处理——透析表和交叉表

1透视表 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等.所进行的计算与数据跟数据透视表中的排列有关. 之所以称为数据透视表,是因为可以动态地改变它们的版面布置,以便按照不同方式分析数据,也可以重新安排行号.列标和页字段. 数据分析中的透析表十分强大,甚至可以说是相当于分组聚合外加哑变量三个步骤了.但有个前提就是:在使用透析表之前,你必须明确知道自己想要的是什么,需要做什么! 当然,有时候你很难直接看出需求.这时候我们就得添加项目和检查每一步来验证我们一步