roy_88版主大人请进下

qq_26006573 2016-08-04 01:56:00
ALTER PROCEDURE P1
(
@StartDate DATETIME , --2016-08-01
@EndDate DATETIME, --2016-08-01 23:59:59
@Usertb_code varchar(50)=NULL
)
AS

DECLARE @Sql NVARCHAR(max)

SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(Sntb_name)+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),Sntb_ksdt,8)>CONVERT(VARCHAR(8),Sntb_jsdt,8)
THEN 'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN ''00:00:00'' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +''''
ELSE
'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +'''' END
+' THEN b.Xfsourcee_jr ELSE 0 END),0)'
FROM dbo.Sntb
--PRINT @Sql
SET @Sql='SELECT '+@Sql+',
COUNT(*) AS 消费次数 ,
COUNT(DISTINCT a.Usertb_code) AS 消费人数 , --这里没意义,显示固定为1,你查的是一个人
ISNULL(SUM(b.Xfsourcee_jr),0) AS 合计
FROM Usertb AS a
INNER JOIN Xfsourcee AS b ON b.Xfsourcee_code = a.Usertb_code
WHERE b.Xfsourcee_sj between @StartDate AND @EndDate'+CASE WHEN @Usertb_code>'' THEN ' AND a.Usertb_code=@Usertb_code' ELSE '' END
EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code
GO

版主大人 roy_88 你给我写的这个过程 有一个地方能修改下么,就是 我想统计出的过来是这样的

早餐金额 早餐人数 早餐笔数 加一个早餐人数和笔数 现在只有总合计的。
...全文
222 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_26006573 2016-08-04
  • 打赏
  • 举报
回复
引用 10 楼 roy_88 的回复:
少了个AND,加上 随便看一下PRINT @Andwhere生成的条件对不对
CREATE PROCEDURE gc_sdhz
    (
      @tj int ,  --判断查调查询
      @StartDate DATETIME ,--开始时间
      @EndDate DATETIME,   --结束时间
      @Usertb_code varchar(50)=NULL --查询条件
    )
AS
 
DECLARE @Sql NVARCHAR(max),@Andwhere NVARCHAR(max)
BEGIN
IF (@tj<=3)--按1~4级部门
BEGIN
SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(xfsd_name)+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 
+' THEN Convert(decimal(18,2),ISNULL(b.smm1+b.smm2,0)/100.0*-1) ELSE 0 END),0),'
+QUOTENAME(xfsd_name+'人数')+'=COUNT(DISTINCT CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN a.DeptNo1 END),'
+QUOTENAME(xfsd_name+'次数')+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN 1 ELSE 0 END),0)'
,@Andwhere=ISNULL(@Andwhere+' OR ','')+
CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN '(CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''')'
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 

FROM dbo.xfsdHzN

PRINT @Sql
PRINT @Andwhere
SET @Sql='SELECT 
            a.DeptNo1, --部门编号
            a.DeptNa1, --部门名称
            '+@Sql+', --时段组合结果
            COUNT(*) AS cs , --消费次数
            COUNT(DISTINCT a.emcode) AS rs , --消费人数          
             Convert(decimal(18,2),ISNULL(SUM(ISNULL(b.smm1+b.smm2,0)/100.0*-1),0)) AS hj --合计
    FROM    VWpersonal AS a
            INNER JOIN xfsourceRec AS b ON b.hrcode = a.emcode
    WHERE  b.recdt between  @StartDate AND @EndDate AND '+@Usertb_code+' AND ('+@Andwhere+') GROUP BY a.DeptNo1,a.DeptNa1' 
EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code
END
END
GO
非常感谢版主的热心帮助结贴了。
中国风 2016-08-04
  • 打赏
  • 举报
回复
少了个AND,加上 随便看一下PRINT @Andwhere生成的条件对不对
CREATE PROCEDURE gc_sdhz
    (
      @tj int ,  --判断查调查询
      @StartDate DATETIME ,--开始时间
      @EndDate DATETIME,   --结束时间
      @Usertb_code varchar(50)=NULL --查询条件
    )
AS
 
DECLARE @Sql NVARCHAR(max),@Andwhere NVARCHAR(max)
BEGIN
IF (@tj<=3)--按1~4级部门
BEGIN
SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(xfsd_name)+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 
+' THEN Convert(decimal(18,2),ISNULL(b.smm1+b.smm2,0)/100.0*-1) ELSE 0 END),0),'
+QUOTENAME(xfsd_name+'人数')+'=COUNT(DISTINCT CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN a.DeptNo1 END),'
+QUOTENAME(xfsd_name+'次数')+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN 1 ELSE 0 END),0)'
,@Andwhere=ISNULL(@Andwhere+' OR ','')+
CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN '(CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''')'
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 

FROM dbo.xfsdHzN

PRINT @Sql
PRINT @Andwhere
SET @Sql='SELECT 
            a.DeptNo1, --部门编号
            a.DeptNa1, --部门名称
            '+@Sql+', --时段组合结果
            COUNT(*) AS cs , --消费次数
            COUNT(DISTINCT a.emcode) AS rs , --消费人数          
             Convert(decimal(18,2),ISNULL(SUM(ISNULL(b.smm1+b.smm2,0)/100.0*-1),0)) AS hj --合计
    FROM    VWpersonal AS a
            INNER JOIN xfsourceRec AS b ON b.hrcode = a.emcode
    WHERE  b.recdt between  @StartDate AND @EndDate AND '+@Usertb_code+' AND ('+@Andwhere+') GROUP BY a.DeptNo1,a.DeptNa1' 
EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code
END
END
GO
qq_26006573 2016-08-04
  • 打赏
  • 举报
回复
引用 8 楼 roy_88 的回复:
用以下方法过滤时间段没有的消费
CREATE PROCEDURE gc_sdhz
    (
      @tj int ,  --判断查调查询
      @StartDate DATETIME ,--开始时间
      @EndDate DATETIME,   --结束时间
      @Usertb_code varchar(50)=NULL --查询条件
    )
AS
 
DECLARE @Sql NVARCHAR(max),@Andwhere NVARCHAR(max)
BEGIN
IF (@tj<=3)--按1~4级部门
BEGIN
SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(xfsd_name)+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 
+' THEN Convert(decimal(18,2),ISNULL(b.smm1+b.smm2,0)/100.0*-1) ELSE 0 END),0),'
+QUOTENAME(xfsd_name+'人数')+'=COUNT(DISTINCT CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN a.DeptNo1 END),'
+QUOTENAME(xfsd_name+'次数')+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN 1 ELSE 0 END),0)'
,@Andwhere=ISNULL(@Andwhere+' OR ','')+
CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN '(CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''')'
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 

FROM dbo.xfsdHzN

PRINT @Sql
SET @Sql='SELECT 
            a.DeptNo1, --部门编号
            a.DeptNa1, --部门名称
            '+@Sql+', --时段组合结果
            COUNT(*) AS cs , --消费次数
            COUNT(DISTINCT a.emcode) AS rs , --消费人数          
             Convert(decimal(18,2),ISNULL(SUM(ISNULL(b.smm1+b.smm2,0)/100.0*-1),0)) AS hj --合计
    FROM    VWpersonal AS a
            INNER JOIN xfsourceRec AS b ON b.hrcode = a.emcode
    WHERE  b.recdt between  @StartDate AND @EndDate AND '+@Usertb_code+'('+@Andwhere+') GROUP BY a.DeptNo1,a.DeptNa1' 
EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code
END
END
GO
[中餐]=ISNULL(SUM(CASE WHEN CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '00:00:00' AND '23:59:59' THEN Convert(decimal(18,2),ISNULL(b.smm1+b.smm2,0)/100.0*-1) ELSE 0 END),0),[中餐人数]=COUNT(DISTINCT CASE WHEN CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '00:00:00' AND '23:59:59' THEN a.DeptNo1 END),[中餐次数]=ISNULL(SUM(CASE WHEN CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '00:00:00' AND '23:59:59' THEN 1 ELSE 0 END),0) 消息 156,级别 15,状态 1,第 10 行 关键字 'CONVERT' 附近有语法错误。
中国风 2016-08-04
  • 打赏
  • 举报
回复
用以下方法过滤时间段没有的消费
CREATE PROCEDURE gc_sdhz
    (
      @tj int ,  --判断查调查询
      @StartDate DATETIME ,--开始时间
      @EndDate DATETIME,   --结束时间
      @Usertb_code varchar(50)=NULL --查询条件
    )
AS
 
DECLARE @Sql NVARCHAR(max),@Andwhere NVARCHAR(max)
BEGIN
IF (@tj<=3)--按1~4级部门
BEGIN
SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(xfsd_name)+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 
+' THEN Convert(decimal(18,2),ISNULL(b.smm1+b.smm2,0)/100.0*-1) ELSE 0 END),0),'
+QUOTENAME(xfsd_name+'人数')+'=COUNT(DISTINCT CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN a.DeptNo1 END),'
+QUOTENAME(xfsd_name+'次数')+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN 'CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END
+' THEN 1 ELSE 0 END),0)'
,@Andwhere=ISNULL(@Andwhere+' OR ','')+
CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) 
THEN '(CONVERT(VARCHAR(8),b.recdt,8)  BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +''')'
ELSE 
    'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END 

FROM dbo.xfsdHzN

PRINT @Sql
SET @Sql='SELECT 
            a.DeptNo1, --部门编号
            a.DeptNa1, --部门名称
            '+@Sql+', --时段组合结果
            COUNT(*) AS cs , --消费次数
            COUNT(DISTINCT a.emcode) AS rs , --消费人数          
             Convert(decimal(18,2),ISNULL(SUM(ISNULL(b.smm1+b.smm2,0)/100.0*-1),0)) AS hj --合计
    FROM    VWpersonal AS a
            INNER JOIN xfsourceRec AS b ON b.hrcode = a.emcode
    WHERE  b.recdt between  @StartDate AND @EndDate AND '+@Usertb_code+'('+@Andwhere+') GROUP BY a.DeptNo1,a.DeptNa1' 
EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code
END
END
GO
qq_26006573 2016-08-04
  • 打赏
  • 举报
回复
引用 6 楼 roy_88 的回复:
如果有消费不在时间段里会不一致,有这样的数据?
是的,我查过了,是因为下面的总计是吧 我传进去查询的所有数据总了 次数 人数 金额的合计,而这里面的数据有可能不在我所统计的那几个时段内,所以时段内没那些数据,总计有,所以就不一样了,下面的合计金额 次数 人数,应该要统计我目前查出的 那些时段里面的合计,而不是我传进去日期的查出来的数据合计。
中国风 2016-08-04
  • 打赏
  • 举报
回复
如果有消费不在时间段里会不一致,有这样的数据?
qq_26006573 2016-08-04
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
次数没问题,不需要过滤重复 人数会过滤重复 如:张三 早餐 张三 晚餐 计算人数过滤重复时,总人数为1,早餐1人,晚餐1人
我估计是不是,上面时段 统计的有些数据不在那些个时段里,下面总计把所有的都计算力面了,所以不一样
qq_26006573 2016-08-04
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
次数没问题,不需要过滤重复 人数会过滤重复 如:张三 早餐 张三 晚餐 计算人数过滤重复时,总人数为1,早餐1人,晚餐1人
CREATE PROCEDURE gc_sdhz ( @tj int , --判断查调查询 @StartDate DATETIME ,--开始时间 @EndDate DATETIME, --结束时间 @Usertb_code varchar(50)=NULL --查询条件 ) AS DECLARE @Sql NVARCHAR(max) BEGIN IF (@tj<=3)--按1~4级部门 BEGIN SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(xfsd_name)+'=ISNULL(SUM(CASE WHEN ' +CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) THEN 'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' ELSE 'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END +' THEN Convert(decimal(18,2),ISNULL(b.smm1+b.smm2,0)/100.0*-1) ELSE 0 END),0),' +QUOTENAME(xfsd_name+'人数')+'=COUNT(DISTINCT CASE WHEN ' +CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) THEN 'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' ELSE 'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END +' THEN a.DeptNo1 END),' +QUOTENAME(xfsd_name+'次数')+'=ISNULL(SUM(CASE WHEN ' +CASE WHEN CONVERT(VARCHAR(8),xfsd_ks,8)>CONVERT(VARCHAR(8),xfsd_js,8) THEN 'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.recdt,8) BETWEEN ''00:00:00'' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' ELSE 'CONVERT(VARCHAR(8),b.recdt,8) BETWEEN '''+CONVERT(VARCHAR(8),xfsd_ks,8) +''' AND '''+CONVERT(VARCHAR(8),xfsd_js,8) +'''' END +' THEN 1 ELSE 0 END),0)' FROM dbo.xfsdHzN PRINT @Sql SET @Sql='SELECT a.DeptNo1, --部门编号 a.DeptNa1, --部门名称 '+@Sql+', --时段组合结果 COUNT(*) AS cs , --消费次数 COUNT(DISTINCT a.emcode) AS rs , --消费人数 Convert(decimal(18,2),ISNULL(SUM(ISNULL(b.smm1+b.smm2,0)/100.0*-1),0)) AS hj --合计 FROM VWpersonal AS a INNER JOIN xfsourceRec AS b ON b.hrcode = a.emcode WHERE b.recdt between @StartDate AND @EndDate AND '+@Usertb_code+' GROUP BY a.DeptNo1,a.DeptNa1' EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code END END GO 版主大人我按照你给的,换成了查部门,结果就出现了 DeptNo1 DeptNa1 中餐 中餐人数 中餐次数 夜餐 夜餐人数 夜餐次数 cs rs hj 100002 业务部 -3.00 1 3 -377.00 1 179 194 6 -389.30 100003 生产部 -0.10 1 1 -190.00 1 81 82 2 -190.10 单独的次数和人数,金额 , 和总数对不上了。
中国风 2016-08-04
  • 打赏
  • 举报
回复
次数没问题,不需要过滤重复 人数会过滤重复 如:张三 早餐 张三 晚餐 计算人数过滤重复时,总人数为1,早餐1人,晚餐1人
qq_26006573 2016-08-04
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
如果是这样,同一个人在早餐/晚餐出现时,会重复计算 这样改

ALTER  PROCEDURE P1
    (
      @StartDate DATETIME ,    --2016-08-01
      @EndDate DATETIME,    --2016-08-01 23:59:59
      @Usertb_code varchar(50)=NULL 
    )
AS
 
DECLARE @Sql NVARCHAR(max)
  
SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(Sntb_name)+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),Sntb_ksdt,8)>CONVERT(VARCHAR(8),Sntb_jsdt,8) 
THEN 'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8)  BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +'''' END 
+' THEN b.Xfsourcee_jr ELSE 0 END),0),'
+QUOTENAME(Sntb_name+'人数')+'=COUNT(DISTINCT CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),Sntb_ksdt,8)>CONVERT(VARCHAR(8),Sntb_jsdt,8) 
THEN 'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8)  BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +'''' END
+' THEN a.Usertb_code END),'
+QUOTENAME(Sntb_name+'次数')+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),Sntb_ksdt,8)>CONVERT(VARCHAR(8),Sntb_jsdt,8) 
THEN 'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8)  BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +'''' END
+' THEN 1 ELSE 0 END),0)'
FROM dbo.Sntb
--PRINT @Sql
SET @Sql='SELECT  '+@Sql+',
            COUNT(*) AS 消费次数 ,
            COUNT(DISTINCT a.Usertb_code) AS 消费人数 ,            --这里没意义,显示固定为1,你查的是一个人
            ISNULL(SUM(b.Xfsourcee_jr),0) AS 合计
    FROM    Usertb AS a
            INNER JOIN Xfsourcee AS b ON b.Xfsourcee_code = a.Usertb_code
    WHERE  b.Xfsourcee_sj between  @StartDate AND @EndDate'+CASE WHEN @Usertb_code>'' THEN ' AND a.Usertb_code=@Usertb_code' ELSE '' END 
EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code

GO
--查某一个员工
EXEC dbo.P1 @StartDate = '2016-08-01', -- date
    @EndDate='2016-08-02 23:59:59',
	@Usertb_code = '00001' -- varchar(50)

--查所有员工
EXEC dbo.P1 @StartDate = '2016-08-01', -- date
    @EndDate='2016-08-02 23:59:59',
    @Usertb_code = '' -- varchar(50)
那这个人早餐消费,晚餐也消费了会出问题么?不是应该2笔记录么?早餐1笔,晚餐1笔,您说的重复是什么意思?
中国风 2016-08-04
  • 打赏
  • 举报
回复
如果是这样,同一个人在早餐/晚餐出现时,会重复计算 这样改

ALTER  PROCEDURE P1
    (
      @StartDate DATETIME ,    --2016-08-01
      @EndDate DATETIME,    --2016-08-01 23:59:59
      @Usertb_code varchar(50)=NULL 
    )
AS
 
DECLARE @Sql NVARCHAR(max)
  
SELECT @Sql=ISNULL(@Sql+',','')+QUOTENAME(Sntb_name)+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),Sntb_ksdt,8)>CONVERT(VARCHAR(8),Sntb_jsdt,8) 
THEN 'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8)  BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +'''' END 
+' THEN b.Xfsourcee_jr ELSE 0 END),0),'
+QUOTENAME(Sntb_name+'人数')+'=COUNT(DISTINCT CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),Sntb_ksdt,8)>CONVERT(VARCHAR(8),Sntb_jsdt,8) 
THEN 'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8)  BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +'''' END
+' THEN a.Usertb_code END),'
+QUOTENAME(Sntb_name+'次数')+'=ISNULL(SUM(CASE WHEN '
+CASE WHEN CONVERT(VARCHAR(8),Sntb_ksdt,8)>CONVERT(VARCHAR(8),Sntb_jsdt,8) 
THEN 'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8)  BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND ''23:59:59'' OR CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN  ''00:00:00'' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +''''
ELSE 
    'CONVERT(VARCHAR(8),b.Xfsourcee_sj,8) BETWEEN '''+CONVERT(VARCHAR(8),Sntb_ksdt,8) +''' AND '''+CONVERT(VARCHAR(8),Sntb_jsdt,8) +'''' END
+' THEN 1 ELSE 0 END),0)'
FROM dbo.Sntb
--PRINT @Sql
SET @Sql='SELECT  '+@Sql+',
            COUNT(*) AS 消费次数 ,
            COUNT(DISTINCT a.Usertb_code) AS 消费人数 ,            --这里没意义,显示固定为1,你查的是一个人
            ISNULL(SUM(b.Xfsourcee_jr),0) AS 合计
    FROM    Usertb AS a
            INNER JOIN Xfsourcee AS b ON b.Xfsourcee_code = a.Usertb_code
    WHERE  b.Xfsourcee_sj between  @StartDate AND @EndDate'+CASE WHEN @Usertb_code>'' THEN ' AND a.Usertb_code=@Usertb_code' ELSE '' END 
EXEC sys.sp_executesql @Sql,N'@StartDate datetime,@EndDate datetime , @Usertb_code varchar(50)',@StartDate,@EndDate,@Usertb_code

GO
--查某一个员工
EXEC dbo.P1 @StartDate = '2016-08-01', -- date
    @EndDate='2016-08-02 23:59:59',
	@Usertb_code = '00001' -- varchar(50)

--查所有员工
EXEC dbo.P1 @StartDate = '2016-08-01', -- date
    @EndDate='2016-08-02 23:59:59',
    @Usertb_code = '' -- varchar(50)
内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,利用Matlab代码实现优化算法的仿真与复现。研究重点在于通过改进的秃鹰搜索算法(Bald Eagle Search Algorithm, BESA)解决微电网群在运行过程中的经济调度问题,提升算法的收敛速度与全局寻优能力,以实现对分布式能源、储能系统及负荷的高效协调管理。文中详细阐述了微电网群的系统架构、数学建模过程、目标函数设计(如运行成本最小化、碳排放降低等),并结合智能优化算法进行求解,验证了改进算法相较于传统方法在调度精度和效率方面的优越性。同时,研究还探讨了算法在多场景下的适应性,为微电网群的智能化、低碳化运行提供了技术支持与实践参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能优化算法相关工作的工程技术人员。; 使用场景及目标:① 学习并掌握改进秃鹰算法在复杂优化问题中的应用方法;② 实现微电网群经济调度模型的构建与求解;③ 对比不同智能算法在电力系统优化中的性能表现;④ 为科研论文复现、课题研究或工程项目提供算法支持与代码参考。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块分析,重点关注算法改进策略与调度模型的耦合实现方式,同时可尝试在不同参数设置或场景条件下进行仿真实验,以加深对算法性能与调度效果的理解。
内容概要:本文围绕多旋翼无人机姿态估计算法的开发与性能评估展开系统性研究,重点对比了线性与非线性滤波算法在复杂飞行环境下的表现。通过构建基于扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)等先进算法的姿态估计器,融合IMU、磁力计、视觉传感器等多源数据,有效提升了姿态解算的精度与鲁棒性。研究涵盖了静态悬停、高速机动及磁干扰等多种典型飞行场景,利用MATLAB/Simulink平台完成仿真实验,并结合实测飞行数据与VICON高精度运动捕捉系统提供的真值进行定量分析。结果表明,非线性滤波器在动态工况下具有显著优势,尤其在抑制漂移和抵抗外部干扰方面优于传统线性方法。文章还提出了传感器融合、自适应建模、冗余配置等一系列降低偏差影响的技术路径,为高可靠性无人机导航系统的设计提供了理论依据与实践指导。; 适合人群:具备控制理论、信号处理及状态估计基础知识,从事无人机导航、控制算法研发或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于开发高精度无人机姿态解算模块;②为多传感器融合算法的设计、实现与验证提供参考案例;③服务于复杂环境下无人系统状态估计的教学演示与科研攻关; 阅读建议:建议结合文中所述MATLAB/Simulink仿真模型与实测数据集进行复现与调试,重点关注EKF与UKF的数学推导、实现细节及关键参数调优过程,深入理解非线性系统建模、状态估计与工程实际之间的平衡与折衷。

22,296

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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