2016-04-21 65 views
0

的總和我有一個SSRS報告,當我試圖計算前值的第一行總是給人不正確的值,因爲對於它來計算沒有以前的號碼。SSRS 2005年以前的日期和時間

=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 

感謝

+0

IIF的'組合()'和'isNothing ()'也許?或者在查詢中創建一個虛擬的第一行,並與您現有的選擇結合? –

+0

不完全知道如何做到這一點 –

回答

0

如果需要,您可以查看以前的同步日期字段,並輸出一個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

感謝您的反饋我已經試過這一點,得到了0.1將嘗試玩弄這更多。 –

+0

如果您想要一個空白字段,您可以將if語句放在外面,將0.0更改爲「」並將計算(包括十進制轉換)放在iif的else部分的旁邊。 – Phyiber

0

你可以一個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,您可以添加分區通過爲數字重置爲1

+0

真棒將在該 –

+0

一個去只是嘗試過了,它說:「不支持OVER SQL構造或語句。」但是當我運行它的報告運行,但給-465 –

+0

嗯..你運行sql 2005或更高? – JamieD77