【问题标题】:SSRS 2005 Previous sum of date and timeSSRS 2005 以前的日期和时间总和
【发布时间】:2016-04-21 11:11:02
【问题描述】:

我有一个 SSRS 报告,当我尝试计算前一个值时,第一行总是给出不正确的值,因为它没有要计算的前一个数字。

=CDec(format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00"))

第一行出来的值是1059831848.62 有没有办法告诉它跳过第一行? 因为我还需要将所有内容相加才能得到总和,计算第一行并给出一个巨大的总数。

我的查询包括以下内容:

SELECT ToppingCount, DriverName, COUNT(Pizza) AS Count, Date, SyncDate, BranchName, Branch
FROM System
WHERE     (Date BETWEEN @datefrom AND @DateTo) AND (Branch IN (@branch)) AND (SystemSource = 'newsys') AND (SystemSource <> 'oldsys')
GROUP BY Pizza, ToppingCount, DriverName, Date, SyncDate, BranchName, Branch
ORDER BY Branch, DriverName, Date

谢谢

【问题讨论】:

  • 可能是iif()isNothing() 的组合?或者在您的查询中创建一个虚拟的第一行并与您现有的选择联合?
  • 不完全确定如何做到这一点

标签: sql-server reporting-services reportingservices-2005


【解决方案1】:

您可以像这样在查询中添加 Row_Number 列..

SELECT  ToppingCount,
        DriverName,
        COUNT(Pizza) AS Count,
        Date,
        SyncDate,
        BranchName,
        Branch,
        ROW_NUMBER() OVER (ORDER BY Branch,DriverName,Date) Rn
FROM    System
WHERE   (Date BETWEEN @datefrom AND @DateTo)
        AND (Branch IN (@branch))
        AND (SystemSource = 'newsys')
        AND (SystemSource <> 'oldsys')
GROUP BY Pizza,
        ToppingCount,
        DriverName,
        Date,
        SyncDate,
        BranchName,
        Branch
ORDER BY Branch,
        DriverName,
        Date

然后在进行计算之前检查您是否在 Rn = 1 上。

=iif(Fields!Rn.Value = 1, "", CDec(format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00")))

=iif(Fields!Rn.Value = 1, 0, CDec(format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00")))

如果需要重新设置分组的Row_Number,可以添加Partition By将数字重置为1

【讨论】:

  • Awesome 会尝试一下
  • 刚试了一下,提示“不支持 OVER SQL 构造或语句。”但是当我运行报告时它运行但给出 -465
  • 嗯.. 你运行的是 sql 2005 或更高版本吗?
  • 是的,坚持 2005 年
  • 我找到了解决这个公式的另一种方法,但是当我尝试对其求和时出现错误。 =(Last(Fields!SyncDate.Value))-(First(Fields!Date.Value))-TimeSpan.FromTicks(sum(Fields!SyncDate.Value-Fields!Date.Value))) 甚至试图 =sum(reportitem !textbox12.value) 但仍然会出错
【解决方案2】:

您可以检查上一个同步日期字段的值,并根据需要输出 0 或空白。

=CDec(iif(IsNothing(previous(Fields!SyncDate.Value)), 0.0, format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00")))

如果没有 row_number,您可以使用外部应用来获取查询中的最后同步日期并预先计算“同步增量”:

SELECT
    p.ToppingCount, 
    p.DriverName,
    p.Date,
    p.SyncDate,
    CASE
        WHEN i.SynchDate IS NULL THEN 0.0
        ELSE DATEDIFF(SS, l.SyncDate, p.Date) / 60.0
    END AS SyncTimeDelta,
    p.BranchName,
    p.Branch,
    COUNT(p.Pizza) AS Count
FROM System p
OUTER APPLY
(
    -- Join clause depends on how you're grouping
    -- in the report.
    SELECT TOP 1
        i.SyncDate
    FROM System i
    WHERE
        i.SystemSource = 'newsys'
        AND i.Branch = p.Branch
        AND i.DriverName = p.DriverName
        AND i.Date < p.Date
    ORDER BY
        i.SyncDate DESC
) l
WHERE
    (p.Date BETWEEN @datefrom AND @DateTo) AND
(p.Branch IN (@branch)) AND
    (p.SystemSource = 'newsys') AND
    (p.SystemSource <> 'oldsys')    -- This will never be evaluated
GROUP BY
    p.Pizza, p.ToppingCount, p.DriverName, p.Date, p.SyncDate, p.BranchName, p.Branch, l.SyncDate
ORDER BY
    p.Branch, p.DriverName, p.Date

这样您就可以对报告中的同步增量求和。我对查询知之甚少,但我做了以下假设:

您希望根据给定分支和驱动程序的公式,在当前 [日期] 列之前的最后同步日期之间的时间。

如果有语法问题,我很抱歉,我在没有参考的情况下打字。

【讨论】:

  • 感谢您的反馈,我已经尝试过这个并得到 0。将尝试更多地玩这个。
  • 如果您想要一个空白字段,您可以将if语句放在外面,将0.0更改为“”并将计算(包括十进制转换)放在iif的else部分。
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多