简体   繁体   English

如何在按子句分组中使用SQL Case?

[英]How to use SQL Case in Group by Clause?

I'm using SQL Case in my select and in group by clause and I'm working in JAVA. 我在select和group by子句中使用SQL Case,并且在JAVA中工作。 Whenever I execute my java program it says: 每当我执行我的Java程序时,它都会说:

Column 'dbo.JOHN_Dashboard.Log_Date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 在选择列表中,列“ dbo.JOHN_Dashboard.Log_Date”无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。

My Query is: 我的查询是:

SELECT EP.Site_Code AS [Site_Code], DB.[Site] AS [Site], DB.[Utility] AS [Utility], 
        CASE ? WHEN 'Raw' THEN dateadd(mi,datediff(mi,0,DB.[log_date]),0) 
        WHEN 'Hour'  THEN dateadd(hh,datediff(hh,0,DB.[log_date]),0)
        WHEN 'Day'   THEN dateadd(dd,datediff(dd,0,DB.[log_date]),0)
        WHEN 'Week'  THEN dateadd(wk,datediff(wk,0,DB.[log_date]),0)
        WHEN 'Month' THEN dateadd(mm,datediff(mm,0,DB.[log_date]),0)
        WHEN 'Year'  THEN dateadd(yy,datediff(yy,0,DB.[log_date]),0)                                                     
        ELSE DB.[log_date]
        END AS [log_date],
        SUM(CASE WHEN DB.[value] >= 0 THEN DB.[value] ELSE 0 END) AS [value],
        SUM(CASE WHEN DB.[Cost] >=0 THEN DB.[cost] ELSE 0 END) AS [Cost],
        SUM(CASE WHEN DB.[CO2] >=0 THEN DB.[CO2] ELSE 0 END) AS [CO],
        MT.[Meter_type_name] AS [Meter Type],
        MN.[Meter_Name] AS [Meter Name],
        U.[Unit_Name] AS [Units],
        EP.EnergyPoint_ID AS [Meter_ID],
        EP.Parent_ID AS [Parent],
        EP.Meter_Description AS [Meter_Description] 
FROM [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]
WHERE [log_date] >= ? AND [Log_Date] < DATEADD(DAY, 1, ?)
AND ( ? IS NULL OR EP.Energypoint_ID = ?)
GROUP BY 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' THEN dateadd(mi,datediff(mi,0,DB.[log_date]),0)
        WHEN 'Hour'  THEN dateadd(hh,datediff(hh,0,DB.[log_date]),0)
        WHEN 'Day'   THEN dateadd(dd,datediff(dd,0,DB.[log_date]),0)
        WHEN 'Week'  THEN dateadd(wk,datediff(wk,0,DB.[log_date]),0)
        WHEN 'Month' THEN dateadd(mm,datediff(mm,0,DB.[log_date]),0)
        WHEN 'Year'  THEN 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' '2016-05-16'
  3. '2016-05-22' '2016-05-22'
  4. 6044 6044
  5. 6044 6044
  6. 'Week' '周'

Note: This query runs without error in SQL Management Studio. 注意:此查询在SQL Management Studio中运行没有错误。

As requested here is a reworked version of your code using a sub-query before grouping. 根据要求,这里是在分组之前使用子查询重新编写的代码版本。 Since I don't have your database I can't guarantee that I have everything exactly right but give this a try. 由于我没有您的数据库,因此无法保证我一切都正确,但是请尝试一下。

I recommend always using a sub-query when your group by has complicated logic that will be repeated in the select. 当您的分组依据具有复杂的逻辑并将在选择中重复时,我建议始终使用子查询。 Some people would probably drop the second criteria and just say whenever the group by has complicated logic. 有些人可能会放弃第二个标准,而只是说当group by具有复杂的逻辑时。

SELECT  sub.Site_Code, sub.[Site], sub.[Utility], sub.[Meter Type],
        sub.[log_date],
        SUM(sub.[value]) as [value],
        SUM(sub.[Cost]) as [cost],
        SUM(sub.[CO]) as [CO],
        sub.[Meter Name], sub.[Units], sub.[Meter_ID],
        sub.[Parent], sub.[Meter_Description]
FROM    (
        SELECT EP.Site_Code AS [Site_Code], DB.[Site] AS [Site], DB.[Utility] AS [Utility], 
                CASE ? WHEN 'Raw' THEN dateadd(mi,datediff(mi,0,DB.[log_date]),0) 
                WHEN 'Hour'  THEN dateadd(hh,datediff(hh,0,DB.[log_date]),0)
                WHEN 'Day'   THEN dateadd(dd,datediff(dd,0,DB.[log_date]),0)
                WHEN 'Week'  THEN dateadd(wk,datediff(wk,0,DB.[log_date]),0)
                WHEN 'Month' THEN dateadd(mm,datediff(mm,0,DB.[log_date]),0)
                WHEN 'Year'  THEN dateadd(yy,datediff(yy,0,DB.[log_date]),0)                                                     
                ELSE DB.[log_date]
                END AS [log_date],
                CASE WHEN DB.[value] >= 0 THEN DB.[value] ELSE 0 END AS [value],
                CASE WHEN DB.[Cost] >=0 THEN DB.[cost] ELSE 0 END AS [Cost],
                CASE WHEN DB.[CO2] >=0 THEN DB.[CO2] ELSE 0 END AS [CO],
                MT.[Meter_type_name] AS [Meter Type],
                MN.[Meter_Name] AS [Meter Name],
                U.[Unit_Name] AS [Units],
                EP.EnergyPoint_ID AS [Meter_ID],
                EP.Parent_ID AS [Parent],
                EP.Meter_Description AS [Meter_Description] 
        FROM [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]
        WHERE [log_date] >= ? AND [Log_Date] < DATEADD(DAY, 1, ?)
        AND ( ? IS NULL OR EP.Energypoint_ID = ?)
        ) sub
GROUP BY 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];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM