1

对不起标题。可能有点混乱!我正在使用的示例表如下所示:

     ID         Quantity         Type
 -----------------------------------------------
     1             14             PO
     1              2             PO  
     1              4             MH  
     1              3             MH
     1              2             MH
     2             16             PO
     2             12             MH
     2              9             MH

这就是我想做的。我想将 ID = 1 和 Type = PO (14 + 2) 的所有数量相加为 SUM_IN。然后,我想将 ID = 1 和 Type = MH (4 + 3 + 2) 的所有数量相加为 SUM_OUT。完成此操作后,我想比较两者并仅在 SUM_OUT > SUM_IN 处返回值。所以对于 ID = 1 不会像 ID = 2 那样返回,因为 (12 + 9) > 16。

有没有办法在 SQL 中做到这一点,或者我需要使用 PL/SQL 和变量来完成任务。我在 PL/SQL 方面的经验很少,但从逻辑上讲,变量似乎是解决问题的最简单方法。我知道选择语句可以存储在变量中,但我不确定如何存储。无论如何,这是我的两个 SQL 选择

  SELECT SUM(QUANTITY) AS SUM_IN
  FROM TRANSLOG
  WHERE TYPE IN ('PO')
  AND ID = '1'

  SELECT SUM(QUANTITY) AS SUM_OUT
  FROM TRANSLOG
  WHERE TYPE IN ('MH')
  AND ID = '1'

因此,如果我可以将这两个都设置为变量,那么任务应该不会太难,对吧???

在此先感谢您的帮助。

4

3 回答 3

2
select ID, 
    sum ( Quantity * case Type when 'po' then 1 else 0 end ) as SUM_IN,
    sum ( Quantity * case Type when 'mh' then 1 else 0 end ) as SUM_OUT
from translog
group by ID
having sum ( Quantity * case Type when 'po' then 1 else -1 end ) < 0
于 2012-09-27T08:31:42.463 回答
1
SELECT CASE WHEN b.SUM_OUT > a.SUM_IN then b.SUM_OUT else '' END as SUM_OUT,
       CASE WHEN b.SUM_OUT > a.SUM_IN then a.SUM_IN else '' END as SUM_IN
FROM

(SELECT ID,SUM(QUANTITY) AS SUM_IN
FROM TRANSLOG
WHERE TYPE IN ('PO')
AND ID = '1'
GROUP BY ID,Type
) a

INNER JOIN 

(SELECT ID,SUM(QUANTITY) AS SUM_OUT
FROM TRANSLOG
WHERE TYPE IN ('MH')
AND ID = '1'
GROUP BY ID,Type
) b

ON a.ID=b.ID
于 2012-09-27T08:37:20.997 回答
1

正如您用plsql标签标记了您的问题,我假设您要执行查询的 RDBMS 是 Oracle。如果是这样,那么这是另一种方法(使用DECODE函数)来获得您想要的结果集。

select *
  from (select id
             , sum(Quantity*decode(tp, 'PO', 1, 0)) as sum_in
             , sum(Quantity*decode(tp, 'MH', 1, 0)) as sum_out
         from t1
        group by id
        order by id  )
 where sum_out > sum_in

结果:

ID    SUM_IN    SUM_OUT
-----------------------
 2     16        21

如果您想与 一起显示其余列sum_insum_out则以下查询可能会派上用场:

select id
     , quantity
     , Tp
     , sum_in
     , sum_out
  from (select id
             , quantity
             , tp
             , sum(Quantity*decode(tp, 'PO', 1, 0)) over(partition by id) as sum_in
             , sum(Quantity*decode(tp, 'MH', 1, 0)) over(partition by id) as sum_out
         from t1
       )
 where sum_out > sum_in

结果:

Id    Quantity    Tp    Sum_In    Sum_Out 
---------------------------------------------
2      16         PO     16        21 
2      12         MH     16        21 
2      9          MH     16        21 
于 2012-09-27T09:45:06.550 回答