2017-08-18 34 views
0

我正在尝试使用此查询来计算每月总和。Group按预期不分组?

SELECT 
    fld_year 
    , fld_month 
    , CONVERT(nvarchar(7), fld_ConsDate, 121) AS fld_ConsDate 
    , fld_ConsumptionValue 
    , fld_Id 
FROM (
    SELECT 
     YEAR(DATEADD(MINUTE, fld_TZAM - 6360, fld_ConsDateTime)) AS fld_year 
     , MONTH(DATEADD(MINUTE, fld_TZAM- 6360, fld_ConsDateTime)) AS fld_month 
     , DATEADD(MONTH, DATEDIFF(MONTH, 0, fld_ConsDateTime), 0) AS fld_ConsDate 
     , SUM(fld_EnergyTotalIndexValue) AS fld_ConsumptionValue 
     , MAX(fld_Id) AS fld_Id 
    FROM tbl_EM_DeviceEnergyHourlyConsumption 
    WHERE fld_Deleted = 0 
     AND fld_Active = 1 
     AND fld_CalculationState = 2 
     AND fld_DeviceId IN (18) 
     AND fld_ConsDateTime >= DATEADD(MINUTE, -1*(fld_TZAM) + 6360, '2017-05-01 00:00:00') 
     AND fld_ConsDateTime < DATEADD(MINUTE, -1*(fld_TZAM) + 6360, '2017-08-01 00:00:00') 
     AND fld_DeviceOrganizationId IN (SELECT Value FROM dbo.fn_OrganizationSubList(2)) 
    GROUP BY 
     YEAR(DATEADD(MINUTE, fld_TZAM - 6360, fld_ConsDateTime)), 
     MONTH(DATEADD(MINUTE, fld_TZAM - 6360, fld_ConsDateTime)), 
     DATEADD(MONTH, DATEDIFF(MONTH, 0, fld_ConsDateTime), 0), 
)T ORDER BY fld_ConsDate ASC 

我希望得到的结果是

fld_year fld_month  fld_ConsDate  fld_ConsumptionValue fld_Id 
2017   5   2017-05    294.1340   
2017   6   2017-06    222.7527   
2017   7   2017-07    318.2111 

而是我得到每个月

fld_year fld_month  fld_ConsDate  fld_ConsumptionValue fld_Id 
    2017   5   2017-05    260.2158   
    2017   6   2017-06    193.4958   
    2017   5   2017-06    33.9182 
    2017   6   2017-07    29.2569   
    2017   7   2017-07    264.8147   
    2017   7   2017-08    53.3964 

2个值我似乎无法弄清楚任何提示我吗?任何人都可以告诉我我的逻辑出错了吗?提前致谢!

+0

你可以尝试在查询中添加不同的**选择不同fld_year ** –

+0

上'fld_ConstDate'包括一天,但你是截断,在对结果进行分组'CONVERT'表达式。您可以使用“GROUP BY”中的“CONVERT”表达式按年份和月份进行分组。 –

回答

2

如果你只想每月有一行,为什么你要包含第三个聚合键?像这样的东西,似乎是你想要什么:

SELECT YEAR(DATEADD(MINUTE, fld_TZAM - 6360, fld_ConsDateTime)) AS fld_year, 
      MONTH(DATEADD(MINUTE, fld_TZAM - 6360, fld_ConsDateTime)) AS fld_month, 
      DATEADD(MONTH, DATEDIFF(MONTH, 0, MIN(fld_ConsDateTime)), 0) AS fld_ConsDate, 
      . . . 
    GROUP BY YEAR(DATEADD(MINUTE, fld_TZAM - 6360, fld_ConsDateTime)), 
      MONTH(DATEADD(MINUTE, fld_TZAM - 6360, fld_ConsDateTime))