2013-10-06 71 views
-1

我有以下數據:運行總計例如

id customer date    value1 value2 isTrue 
10 13 2013-08-20 00:00:00.0000 170  180680 0 
11 13 2013-09-02 00:00:00.0000 190  181830 0 
12 13 2013-09-07 00:00:00.0000 150  183000 1 
13 13 2013-09-14 00:00:00.0000 150  183930 0 
14 13 2013-09-16 00:00:00.0000 150  184830 0 
15 13 2013-09-19 00:00:00.0000 150  185765 1 
16 13 2013-09-30 00:00:00.0000 800  187080 0 
17 13 2013-10-02 00:00:00.0000 100  188210 0 
28 13 2013-10-04 00:00:00.0000 380  188250 1 

我怎麼可以有以下結果,其中SumValue1是值1的summury直到現場IsTrue運算得到真正和復位後與差異值2是現場的差異value2每次IsTrue字段變爲True?

id customer date    value1 value2 isTrue SumValue1 DifferenceValue2 
10 13 2013-08-20 00:00:00.0000 170  180680 0 
11 13 2013-09-02 00:00:00.0000 190  181830 0 
12 13 2013-09-07 00:00:00.0000 150  183000 1  510  2320 
13 13 2013-09-14 00:00:00.0000 150  183930 0 
14 13 2013-09-16 00:00:00.0000 150  184830 0 
15 13 2013-09-19 00:00:00.0000 150  185765 1  450  2765 
16 13 2013-09-30 00:00:00.0000 800  187080 0 
17 13 2013-10-02 00:00:00.0000 100  188210 0 
28 13 2013-10-04 00:00:00.0000 380  188250 1  1280  2485 
+0

感謝您的編輯Juergen d – albertsmus

+0

在您的示例中,第一個「DifferenceValue2」值不根據描述進行計算。 –

+1

記錄是通過'id'還是'date'排序的? –

回答

0

假設id排序,這個查詢將做到:

SELECT 
    id, customer, date, value1, value2, isTrue, 
    CASE isTrue WHEN 1 THEN (SELECT TOTAL(value1) FROM t WHERE customer=t2.customer AND id>t2.prev_id AND id<=t2.id) END AS SumValue1, 
    CASE isTrue WHEN 1 THEN value2-(SELECT value2 FROM t WHERE customer=t2.customer AND id=t2.prev_id) END AS DifferenceValue2 
FROM (SELECT *, CASE isTrue WHEN 1 THEN COALESCE((SELECT id FROM t AS _ WHERE customer=t.customer AND date<t.date AND isTrue ORDER BY date DESC LIMIT 1), -1) END AS prev_id FROM t) AS t2; 

步驟一步:

SELECT id FROM t AS _ WHERE customer=t.customer AND date<t.date AND isTrue ORDER BY date DESC LIMIT 1 

使用COALESCE(..., -1)將確保:

上一頁id其中isTrue由下式給出非空id之前所有其他人(-1)。

SELECT *, CASE isTrue WHEN 1 THEN ... END AS prev_id FROM t將返回t的所有行,並添加列prev_id

最後,查詢SELECT TOTAL(value1) FROM t WHERE customer=t2.customer AND id>t2.prev_id AND id<=t2.idvalue2-(SELECT value2 FROM t WHERE customer=t2.customer AND id=t2.prev_id比以前的結果將返回所需的結果。

+0

感謝您的幫助LS_dev。它正在工作。 – albertsmus