【问题标题】:SSRS - Why isn't my SUM() working correctly?SSRS - 为什么我的 SUM() 不能正常工作?
【发布时间】:2015-09-08 19:25:19
【问题描述】:

我遵循了 techonthenet 上的指南,其中说对于 SUM 查询,您需要将 Sum(expr) 放入 SELECT 语句中,然后将 GROUP BY 放入您选择的所有其他字段(伪代码;如果我错了)。下面是我的尝试。为什么会出现错误

“执行查询时出错。'('附近的语法不正确。错误:102;第9行”

这一切的最终结果将是一份报告,而不仅仅是一个查询。在报告中,除了 [差异] 字段将在底部汇总之外,将显示以下所有字段。我觉得与其在查询中求和,不如在报告中求和……

EDIT - 我删除了 [ALL],但现在我收到错误消息“不能在用于 GROUP BY 子句的分组列表的表达式中使用聚合或子查询。”它还说这个错误在第29行。我会在下面标记它。

SELECT 

    JOB.WHSE,
    LEFT(RESSCHD000.RESID, 6) AS Line,
        RIGHT(LEFT(JOB000.JSID, 11), 10)+ '-' +RIGHT(LEFT(JOB000.JSID, 27), 2) AS [Job Number],
    LEFT(RESSCHD000.STARTDATE, 7)+ '         ' +RIGHT(Convert(Datetime, MIN(RESSCHD000.STARTDATE)), 8) AS [Start],
    LEFT(RESSCHD000.ENDDATE, 7)+ '     ' +RIGHT(Convert(Datetime, MAX(RESSCHD000.ENDDATE)),8) AS [End], 
        RESSCHD000.STATUSCD, 
        Sum((Dateadd("n",DateDiff("n", MIN(RESSCHD000.STARTDATE),MAX(RESSCHD000.ENDDATE)),'00:00:00'))) AS [SumOfDifference], 
        RESSCHD000.JOBTAG,
    CASE
        WHEN    Dateadd("n",DateDiff("n", MIN(RESSCHD000.STARTDATE),MAX(RESSCHD000.ENDDATE)),'00:00:00') > '3:59:00'
                THEN 'Full Sanitation'
        ELSE    'Dry Clean' 
    END AS [Type of Sanitation],
    jrt_sch.Uf_Quoted_Crew_Size AS [Crew Size]

FROM 
        RESSCHD000 INNER JOIN JOB000 ON RESSCHD000.JOBTAG = JOB000.JOBTAG
    INNER JOIN JOB ON JOB.JOB = RIGHT(LEFT(JOB000.JSID, 11), 10) AND JOB.suffix = RIGHT(LEFT(JOB000.JSID, 27), 2)
    LEFT OUTER JOIN jrt_sch ON jrt_sch.job = job.job
WHERE
    job.job_date = @job_date

GROUP BY 
    JOB.WHSE,
    LEFT(RESSCHD000.RESID, 6),
    RIGHT(LEFT(JOB000.JSID, 11), 10)+ '-' +RIGHT(LEFT(JOB000.JSID, 27), 2), --line 29
    LEFT(RESSCHD000.STARTDATE, 7)+ '         ' +RIGHT(Convert(Datetime, MIN(RESSCHD000.STARTDATE)), 8),
    LEFT(RESSCHD000.ENDDATE, 7)+ '     ' +RIGHT(Convert(Datetime, MAX(RESSCHD000.ENDDATE)),8), 
    RESSCHD000.STATUSCD, 
    RESSCHD000.JOBTAG,
    CASE
        WHEN    Dateadd("n",DateDiff("n", MIN(RESSCHD000.STARTDATE),MAX(RESSCHD000.ENDDATE)),'00:00:00') > '3:59:00'
                THEN 'Full Sanitation'
        ELSE    'Dry Clean' 
    END,
    jrt_sch.Uf_Quoted_Crew_Size

HAVING 
                RESSCHD000.STATUSCD='s'

【问题讨论】:

标签: sql reporting-services syntax


【解决方案1】:

错误是由于这一行:

Sum([ALL] (Dateadd("n",DateDiff("n", MIN(RESSCHD000.STARTDATE),MAX(RESSCHD000.ENDDATE)),'00:00:00'))) AS [SumOfDifference] 

总和正在寻找要求和的字段(或某种公式)。您有一个字段名称,后跟一个公式。我猜你想要基于 FIELD 名称 (SumOfDifference) 以秒为单位的差异总和。

我认为您只需要删除 [ALL]。

SUM(DATEADD("n",DATEDIFF("n", MIN(RESSCHD000.STARTDATE), MAX(RESSCHD000.ENDDATE)),'00:00:00')) AS [SumOfDifference]

【讨论】:

  • 嗯...仍然出现错误,尽管是不同的错误。请参阅编辑后的答案。
  • 啊——你有一个 MIN 和 MAX 作为你的 Start 和 End 字段的一部分。您可以尝试将它们从 Group By 中删除。如果这不起作用;您可以将 LEFT 部分分成单独的列并按其分组,并将 RIGHT Min/Max 作为另一列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多