2010-06-07 64 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