java - How to use SQL Case in Group by Clause? -


i'm using sql case in select , in group clause , i'm working in java. whenever execute java program says:

column 'dbo.john_dashboard.log_date' invalid in select list because not contained in either aggregate function or group clause.

my query is:

select ep.site_code [site_code], db.[site] [site], db.[utility] [utility],          case ? when 'raw' dateadd(mi,datediff(mi,0,db.[log_date]),0)          when 'hour'  dateadd(hh,datediff(hh,0,db.[log_date]),0)         when 'day'   dateadd(dd,datediff(dd,0,db.[log_date]),0)         when 'week'  dateadd(wk,datediff(wk,0,db.[log_date]),0)         when 'month' dateadd(mm,datediff(mm,0,db.[log_date]),0)         when 'year'  dateadd(yy,datediff(yy,0,db.[log_date]),0)                                                              else db.[log_date]         end [log_date],         sum(case when db.[value] >= 0 db.[value] else 0 end) [value],         sum(case when db.[cost] >=0 db.[cost] else 0 end) [cost],         sum(case when db.[co2] >=0 db.[co2] else 0 end) [co],         mt.[meter_type_name] [meter type],         mn.[meter_name] [meter name],         u.[unit_name] [units],         ep.energypoint_id [meter_id],         ep.parent_id [parent],         ep.meter_description [meter_description]  [dbo].[john_dashboard] db inner join [dbo].[energypoints] ep on db.[energypoint_id] = ep.[energypoint_id]  inner join [dbo].[meter_types] mt on mt.[meter_type_id] = ep.[meter_type_id] inner join [dbo].[meter_names] mn on mn.[meter_name_id] = ep.[meter_name_id] inner join [dbo].[units] u on u.[unit_id] = ep.[unit_id] [log_date] >= ? , [log_date] < dateadd(day, 1, ?) , ( ? null or ep.energypoint_id = ?) group ep.site_code, db.[site], db.[utility], mt.[meter_type_name],                    mn.[meter_name], u.[unit_name], ep.[energypoint_id],         ep.[parent_id], ep.[meter_description],         case ? when 'raw' dateadd(mi,datediff(mi,0,db.[log_date]),0)         when 'hour'  dateadd(hh,datediff(hh,0,db.[log_date]),0)         when 'day'   dateadd(dd,datediff(dd,0,db.[log_date]),0)         when 'week'  dateadd(wk,datediff(wk,0,db.[log_date]),0)         when 'month' dateadd(mm,datediff(mm,0,db.[log_date]),0)         when 'year'  dateadd(yy,datediff(yy,0,db.[log_date]),0)         else db.[log_date] end ; 

the parameters i'm passing are:

  1. 'week'
  2. '2016-05-16'
  3. '2016-05-22'
  4. 6044
  5. 6044
  6. 'week'

note: query runs without error in sql management studio.

as requested here reworked version of code using sub-query before grouping. since don't have database can't guarantee have right give try.

i recommend using sub-query when group has complicated logic repeated in select. people drop second criteria , whenever group has complicated logic.

select  sub.site_code, sub.[site], sub.[utility], sub.[meter type],         sub.[log_date],         sum(sub.[value]) [value],         sum(sub.[cost]) [cost],         sum(sub.[co]) [co],         sub.[meter name], sub.[units], sub.[meter_id],         sub.[parent], sub.[meter_description]    (         select ep.site_code [site_code], db.[site] [site], db.[utility] [utility],                  case ? when 'raw' dateadd(mi,datediff(mi,0,db.[log_date]),0)                  when 'hour'  dateadd(hh,datediff(hh,0,db.[log_date]),0)                 when 'day'   dateadd(dd,datediff(dd,0,db.[log_date]),0)                 when 'week'  dateadd(wk,datediff(wk,0,db.[log_date]),0)                 when 'month' dateadd(mm,datediff(mm,0,db.[log_date]),0)                 when 'year'  dateadd(yy,datediff(yy,0,db.[log_date]),0)                                                                      else db.[log_date]                 end [log_date],                 case when db.[value] >= 0 db.[value] else 0 end [value],                 case when db.[cost] >=0 db.[cost] else 0 end [cost],                 case when db.[co2] >=0 db.[co2] else 0 end [co],                 mt.[meter_type_name] [meter type],                 mn.[meter_name] [meter name],                 u.[unit_name] [units],                 ep.energypoint_id [meter_id],                 ep.parent_id [parent],                 ep.meter_description [meter_description]          [dbo].[john_dashboard] db         inner join [dbo].[energypoints] ep on db.[energypoint_id] = ep.[energypoint_id]          inner join [dbo].[meter_types] mt on mt.[meter_type_id] = ep.[meter_type_id]         inner join [dbo].[meter_names] mn on mn.[meter_name_id] = ep.[meter_name_id]         inner join [dbo].[units] u on u.[unit_id] = ep.[unit_id]         [log_date] >= ? , [log_date] < dateadd(day, 1, ?)         , ( ? null or ep.energypoint_id = ?)         ) sub group sub.site_code, sub.[site], sub.[utility], sub.[meter type],                    sub.[meter name], sub.[units], sub.[meter_id],         sub.[parent], sub.[meter_description], sub.[log_date]; 

Comments

Popular posts from this blog

sql - invalid in the select list because it is not contained in either an aggregate function -

Angularjs unit testing - ng-disabled not working when adding text to textarea -

How to start daemon on android by adb -