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:
- 'week'
- '2016-05-16'
- '2016-05-22'
- 6044
- 6044
- '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
Post a Comment