2015-09-16 73 views
1

我有以下SQL表(第一個表),其中此表存儲特定商店的訂單。我不確定是否有可能,但我想創建一個像第二個表一樣的視圖。基於當前行的SQL SELECT語句的計數器

field orderNumber包含特定訂單的編號。具有相同訂單號的行意味着屬於相同的訂單。

因此,基於orderNumber和第一個表的類型,我希望生成字段dealCounter(請參閱第二個表),其中計算每個訂單的交易數量並將相同數量的dealCounter分配給所有屬於它的行以相同的順序。

每次我們找到類型12時,我們增加一個dealCounter。如果我們更改orderNumber然後重置dealCounter。

我試圖使用rank()函數,但我無法管理dealCounter並設置我想要的值。

有什麼辦法可以解決我的問題嗎?

menuid type orderNumber storeNumber lineNumber 
--------------------------------------------------- 
10  12 100122  10   0 
8  9  100122  10   1 
5  9  100122  10   2 
3  9  100122  10   3 
11  12 100122  10   4 
5  9  100122  10   5 
3  9  100122  10   6 
10  12 100122  10   7 
8  9  100122  10   8 
5  9  100122  10   9 
3  9  100122  10   10 
10  12 10
8  9  10
5  9  10
3  9  10
11  12 10
5  9  10
3  9  10


dealCounter menuid type orderNumber storeNumber lineNumber 
--------------------------------------------------------------- 
1   10  12 100122  10   0 
1   8  9  100122  10   1 
1   5  9  100122  10   2 
1   3  9  100122  10   3 
2   11  12 100122  10   4 
2   5  9  100122  10   5 
2   3  9  100122  10   6 
3   10  12 100122  10   7 
3   8  9  100122  10   8 
3   5  9  100122  10   9 
3   3  9  100122  10   10 
1   10  12 10
1   8  9  10
1   5  9  10
1   3  9  10
2   11  12 10
2   5  9  10
2   3  9  10
+1

mysql或sql server? –

+1

'group by'和'count()'沒有幫助? – demo

+0

sql server .... – user2242558

回答

2

您可以使用CROSS APPLY

SELECT t3.cnt AS dealCounter, menuid, type, orderNumber, storeNumber 
FROM mytable AS t1 
CROSS APPLY (
    SELECT COUNT(CASE WHEN type = 12 THEN 1 END) AS cnt 
    FROM mytable AS t2 
    WHERE t1.orderNumber = t2.orderNumber 
     AND t2.lineNumber <= t1.lineNumber) AS t3 

對於mytable每一行,我們應用CROSS APPLY操作,這樣才能得到的type=12記錄計數先於或與一致行和屬於同一orderNumber內片。

Demo here

+0

我已經嘗試這個解決方案,但dealCounter總是零... – user2242558

+0

@ user2242558我認爲在這種情況下,要麼你沒有正確地將查詢應用到你的實際數據,要麼你的實際數據沒有被正確反映在OP。你檢查過我製作的sqlfiddle嗎? –

+0

是的,我剛剛檢查了sqlfiddle,看起來不錯,但是當我在我的真實數據庫中運行SQL腳本時無法正常工作。下面就是我想:「SELECT t3.cnt AS dealCounter,menuuid,菜單名稱,n_type,orderitemtype,n_ordernum,n_line FROM OrderDetails3_vw 爲T1 CROSS APPLY( SELECT COUNT(CASE WHEN n_type = 12 THEN 1 END)AS cnt FROM OrderDetails3_vw AS t2 WHERE t1.n_ordernum = t2.n_ordernum AND t2.n_line <= t1.n_line AND t1.thedate>'2014-01-31 00:00:00.000'and t1.thedate <'2014 -02-02 00:00:00.000')AS t3' – user2242558

1
select 
    sum(case when type=12 then 1 end) 
    over (partition by ordernumber order by lineNumber) as dealCounter, 
    menuid, type, orderNumber, storeNumber 
from your_table; 

這是一個運行總和(我們通過LINENUMBER訂購)考慮1,其中類型= 12。該計數器將重置在每個新的訂單號(分區)

編輯:使用Giorgios的小提琴。儘管你的版本哪些評論者說不支持運行總和,這似乎在sqlfiddle上運行正常。 Result

+0

問題是針對sqlserver 2008,這是2012語法 –

+0

實際上,SQL 2008中不支持'sum(...)over(...)'。 –

+0

@ t-clausen.dk不知道。我有oracle背景。所以,解決方案將對其他人有用,但對OP不會有用。 –