我有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
类型列,这意味着如果1,这是在我的商店>>>,如果2,这是从我的商店>>的项目
我需要查询才能给出这样的结果
item in out net
s1 300 195 105
>>等
如何编写给我这个结果>>的查询,如果我必须将它们放在两个表中,输入表的>>表和out的表,如果这有助于>>>如何预先构建查询>和>>> :)
注:我正在研究准入问题。
发布于 2014-04-26 00:00:24
获得结果的一种方法是在表达式上使用聚合函数,该表达式根据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和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不支持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
发布于 2014-04-25 23:59:15
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;
我希望这是你所需要的。
https://stackoverflow.com/questions/23304841
复制相似问题