2010-06-07 35 views
-1

我想計算此表的結果。 我想要數量1 - 數量2作爲下表中顯示的另一列。 此表有更多這樣的記錄如何從此數據中獲得結果

我想查詢但不能得到結果。

select * from v order by is_active desc, transaction_id desc 


PK_GUEST_ITEM_ID FK_GUEST_ID   QUANTITY    TRANSACTION_ID  IS_ACTIVE 
---------------- -------------------- ---------------------- -------------------- ----------- 
12963   559     82000     795     1 
12988   559     79000     794     0 
12987   559     76000     793     0 
12986   559     73000     792     0 
12985   559     70000     791     0 
12984   559     67000     790     0 
12983   559     64000     789     0 
12982   559     61000     788     0 
12981   559     58000     787     0 
12980   559     55000     786     0 
12979   559     52000     785     0 
12978   559     49000     784     0 
12977   559     46000     783     0 
12976   559     43000     782     0 

我想另一列將包含減去兩個數量。

理想的結果應當是這樣的

PK_GUEST_ITEM_ID FK_GUEST_ID   QUANTITY  Result   TRANSACTION_ID  IS_ACTIVE 
---------------- -------------------- ---------------------- -------------------- ----------- 
12963   559     82000  3000   795     1 
12988   559     79000  3000   794     0 
12987   559     76000  3000   793     0 
12986   559     73000  3000   792     0 
12985   559     70000  3000   791     0 
12984   559     67000  3000   790     0 
12983   559     64000  3000   789     0 
12982   559     61000  3000   788     0 
12981   559     58000  3000   787     0 
12980   559     55000  3000   786     0 
12979   559     52000  3000   785     0 
12978   559     49000  3000   784     0 
12977   559     46000  3000   783     0 
12976   559     43000  NULL   782     0 
+2

數量2在哪裏? – 2010-06-07 11:51:52

+0

@Ramesh:在同一張表內。即(數量795個交易 - 數量@ 794)作爲交易795的結果,類似地對於較低的記錄。這意味着在交易782將有NULL – 2010-06-07 11:56:20

+1

這是沒有意義的。你能提供一個預期產出應該是什麼樣子的例子嗎? – StingyJack 2010-06-07 12:02:32

回答

4

要獲取下一個較低的事務ID,您可以使用一個子集RY

Select max(transactionid) 
from vinner 
where vinner.tr.ansactionid <vouter.transactionid 

也能正常工作對我來說:

select v1.transactionid as HigherTransactionID 
     ,v2.transactionid as LowerTransactionId 
    ,v1.quantity as HigherQuan 
    ,v2.quantity as LowerQuan 
     ,v1.quantity - v2.quantity as Result 
from v as v1 
    left join v as v2 on 
v2.transactionid = 
      (Select MAX(v.transactionid) 
      from v 
       where v.transactionid < v1.transactionid) 

與下表測試:

quantity transactionid 
8200   795 
7900   794 
6600   793 
6300   792 
6000   788 
5700   787 
4300   786 

有了結果如下:

HigherTransactionID LowerTransactionId HigherQuan LowerQuan Result 
795     794     8200   7900   300 
794     793     7900   6600   1300 
793     792      6600   6300   300 
792     788      6300   6000   300 
788     787      6000   5700   300 
787     786      5700   4300   1400 
786     NULL     4300   NULL   NULL 

希望這是你所期望的

+0

你沒有提到如何查詢vouter – 2010-06-07 12:42:15

+0

編輯answear和查詢現在包括 – kamahl 2010-06-07 13:37:09

+0

哦,這很好,你的工作真的很難回答。信貸去找你。 – 2010-06-07 13:47:19

1

嘗試是這樣的:

SELECT 
    v1.*, 
    v1.QUANTITY - v2.QUANTITY AS result 
FROM 
    v AS v1 
    -- always join transaction (some will be NULL in result) 
    LEFT JOIN 
     v AS v2 
    ON 
     -- join to lower trans id 
     v2.PK_TRANSACTION_ID = v1.PK_TRANSACTION_ID-1 
WHERE 
    -- get only odd trans ids 
    v1.PK_TRANSACTION_ID % 2 = 1 
ORDER BY 
    is_active DESC, 
    transaction_id DESC 

但恐怕它不會是速度:(守護進程

+0

@Grzegorz:Thx它的工作,但如果事務ID沒有序列化,即下一個事務ID可能是-4而不是-1。 我們有辦法獲得下一個交易編號 – 2010-06-07 12:10:14

+0

在一個查詢中,找到一對'trans id'就像你想要的 - 對不起,不知道:(。 – 2010-06-07 12:19:59

+0

爲什麼只有奇怪的結果?我相信OP想要所有結果 – ANeves 2010-06-07 13:41:28

0
select order2.Quantity-order1.Quantity,order1.fk_guestId, ...from v order1 
join v order2 on order1.Transaction_id=order2.transaction_id+1 
by is_active desc, transaction_id desc 
+0

如果事務ID沒有序列化。說795,792,791,776等。 – 2010-06-07 12:15:13

相關問題