如何构建此查询?

时间:2014-04-25 23:47:37

标签: mysql database oracle oracle11g oracle10g

我有桌子 http://oi58.tinypic.com/2s7xreo.jpg

 id    action_date  type  item_id  quantity
---    -----------  ----  -------  --------
 87    4/25/2014    1     s-1           100
 88    4/1/2014     1     s-1           150
 89    4/4/2014     1     s-1           200
 90    4/3/2014     1     s-2           222
 91    4/7/2014     1     s-2            10
 96    4/4/2014     1     s-2             8
 97    4/22/2014    1     s-2             8
 98    4/21/2014    2     s-1           255
 99    4/5/2014     2     s-1             6
100    4/6/2014     2     s-2           190
101    4/6/2014     2     s-3            96
102    4/8/2014     2     s-1           120
103    4/15/2014    2     s-2             3
104    4/16/2014    2     s-2             3

类型列,表示如果这是我商店的项目>>>如果2这是我商店的商品>>

我需要查询给我这样的结果

item   in   out   net 

s1     300  195  105

依此类推>>

如何编写给我这个结果的查询>> 如果我必须,但他们在拖车表>>如果该帮助>>>表格中的表格和表格如何构建查询> 和thanx提前:))

注意::我正在进行访问

2 个答案:

答案 0 :(得分:1)

获得结果的一种方法是在表达式上使用聚合函数,该函数根据quantity的值有条件地返回type的值。

SELECT t.item
     , SUM(CASE WHEN t.type = 1 THEN t.quantity ELSE 0 END) AS in_
     , SUM(CASE WHEN t.type = 2 THEN t.quantity ELSE 0 END) AS out_
     , SUM(CASE WHEN t.type = 1 THEN t.quantity ELSE 0 END) 
       - SUM(CASE WHEN t.type = 2 THEN t.quantity ELSE 0 END) AS net_
  FROM mytable t
 GROUP BY t.item

这种方法适用于Oracle,以及MySQL和SQL Server。

(如果删除SUM()聚合函数和GROUP BY子句,您可以看到CASE表达式是如何工作的。上面的查询给出了您指定的结果,这个是只是一个有助于解释"该查询如何工作的演示。)

SELECT t.item
     , CASE WHEN t.type = 1 THEN t.quantity ELSE 0 END AS in_
     , CASE WHEN t.type = 2 THEN t.quantity ELSE 0 END AS out_
     , t.*
  FROM mytable t

<强>更新

不幸的是,Microsoft Access不支持CASE表达式。但Access确实具有iif功能。应该使用相同的方法,语法可能是这样的:

SELECT t.item
     , SUM(iif(t.type = 1, t.quantity, 0) AS in_
     , SUM(iif(t.type = 2, t.quantity, 0) AS out_
     , SUM(iif(t.type = 1, t.quantity, 0)
       - SUM(iif(t.type = 2, t.quantity, 0) AS net_
  FROM mytable t
 GROUP BY t.item

答案 1 :(得分:0)

SELECT item_id,
       In_col,
       Out_col,
       (In_col - Out_col) AS Net
FROM
  (SELECT item_id,
          sum(CASE WHEN TYPE = 1 THEN quantity END) AS In_col,
          sum(CASE WHEN TYPE = 2 THEN quantity END) AS Out_col
   FROM TABLE
   GROUP BY item_id) AS t1;

我希望这是你需要的。