【问题标题】:Union all with group by in sql: not contained in either an aggregate function or the GROUP BY在 sql 中将所有与 group by 联合:不包含在聚合函数或 GROUP BY 中
【发布时间】:2013-09-05 15:45:21
【问题描述】:

我的存储过程是这样的:

ALTER PROCEDURE [dbo].[Driverperformance] @Ecode     NVARCHAR(50), 
                                          @startdate DATETIME, 
                                          @enddate   DATETIME 
AS 
  BEGIN 
      DECLARE @date1 DATETIME = CONVERT(DATETIME, @startdate + ' 00:01:00.000', 
                                120); 
      DECLARE @date2 DATETIME = CONVERT(DATETIME, @enddate + ' 23:23:59.000', 
                                120) 
      ; 

      SELECT e.ecode, 
             Cast(q.dtime AS DATE) AS Date, 
             e.ename, 
             Count(q.ecode)        CntEcode 
      FROM   employeemaster_tbl e 
             JOIN transaction_tbl q 
               ON e.ecode = q.ecode 
      WHERE  q.ecode = @Ecode 
             AND dtime >= '' + @date1 + '' 
             AND dtime <= '' + @date2 + '' 
      UNION 
      SELECT e.ecode, 
             Cast(q.dtime AS DATE) AS Date, 
             e.ename, 
             Count(q.delecode)     DelEcode 
      FROM   employeemaster_tbl e 
             JOIN transaction_tbl q 
               ON e.ecode = q.delecode 
      WHERE  q.delecode = @Ecode 
             AND dtime >= '' + @date1 + '' 
             AND dtime <= '' + @date2 + '' 
      GROUP  BY e.ecode, 
                e.ename, 
                Cast(q.dtime AS DATE) 
      ORDER  BY Cast(q.dtime AS DATE) 
  END 

执行此操作时出现错误:

选择列表中的“EmployeeMaster_tbl.Ecode”列无效 因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    你在UNION之前的代码段中漏掉了GROUP BY

    ALTER PROCEDURE [dbo].[Driverperformance] @Ecode     NVARCHAR(50), 
                                              @startdate DATETIME, 
                                              @enddate   DATETIME 
    AS 
      BEGIN 
          DECLARE @date1 DATETIME = CONVERT(DATETIME, @startdate + ' 00:01:00.000', 
                                    120); 
          DECLARE @date2 DATETIME = CONVERT(DATETIME, @enddate + ' 23:23:59.000', 
                                    120) 
          ; 
    
          SELECT e.ecode, 
                 Cast(q.dtime AS DATE) AS Date, 
                 e.ename, 
                 Count(q.ecode)        CntEcode 
          FROM   employeemaster_tbl e 
                 JOIN transaction_tbl q 
                   ON e.ecode = q.ecode 
          WHERE  q.ecode = @Ecode 
                 AND dtime >= '' + @date1 + '' 
                 AND dtime <= '' + @date2 + ''
          GROUP  BY e.ecode, 
                    e.ename, 
                    Cast(q.dtime AS DATE)              
          UNION 
          SELECT e.ecode, 
                 Cast(q.dtime AS DATE) AS Date, 
                 e.ename, 
                 Count(q.delecode)     DelEcode 
          FROM   employeemaster_tbl e 
                 JOIN transaction_tbl q 
                   ON e.ecode = q.delecode 
          WHERE  q.delecode = @Ecode 
                 AND dtime >= '' + @date1 + '' 
                 AND dtime <= '' + @date2 + '' 
          GROUP  BY e.ecode, 
                    e.ename, 
                    Cast(q.dtime AS DATE) 
          ORDER  BY Cast(q.dtime AS DATE) 
      END 
    

    拉吉

    【讨论】:

    • 如果我删除联合我会得到两个结果..实际上我想加入这两个结果..这就是我使用联合的原因,
    • 除非你想要 DISTINCT 结果,否则你应该使用UNION ALL
    • 我想得到这样的结果:
    • Ecode Date Ename CntEcode DelEcode E003 2013-05-05 Raheem 4 3 E003 2013-05-27 Raheem 0 7 E003 2013-05-28 Raheem 1 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多