SELECT ACC_DTE,
       SUM(CASE WHEN TRX_AMT > 0 THEN ABS(TRX_AMT) ELSE  NULL END),
       SUM(CASE WHEN TRX_AMT < 0 THEN ABS(TRX_AMT) ELSE  NULL END)
  FROM TAB
 GROUP BY ACC_DTE

解决方案 »

  1.   

    我问下楼主,如果一个acc_dte对应3个trx_amt该怎么办呢?
      

  2.   

    SELECT ACC_DTE,
           SUM(CASE WHEN TRX_AMT > 0 THEN ABS(TRX_AMT) ELSE  NULL END),
           SUM(CASE WHEN TRX_AMT < 0 THEN ABS(TRX_AMT) ELSE  NULL END)
      FROM TAB
     GROUP BY ACC_DTE大神 这SUM值函数是 相加的意思吧?  我感觉SQL的IF ELSE 看起来有点不懂  他这是怎么判断的? 每条数据都进行 这2个判断吗?   例如 第一条 2013-02-15  100块  第一个条件成立 就是100第一个值就是100的绝对值
                        第二条 2013-02-15  -50快   第一个条件不成立 第二个条件成立 就是50  疑惑来了 为什么这么做可以 让他们在同行中 ?????
       2012-02-15  100 50 
      

  3.   

    SELECT ACC_DTE,
           SUM(CASE WHEN TRX_AMT > 0 THEN ABS(TRX_AMT) ELSE  NULL END),
           SUM(CASE WHEN TRX_AMT < 0 THEN ABS(TRX_AMT) ELSE  NULL END)
      FROM TAB
     GROUP BY ACC_DTE大神 这SUM值函数是 相加的意思吧?  我感觉SQL的IF ELSE 看起来有点不懂  他这是怎么判断的? 每条数据都进行 这2个判断吗?   例如 第一条 2013-02-15  100块  第一个条件成立 就是100第一个值就是100的绝对值
                        第二条 2013-02-15  -50快   第一个条件不成立 第二个条件成立 就是50  疑惑来了 为什么这么做可以 让他们在同行中 ?????
       2012-02-15  100 50 
    其实那个位置sum、max、min都可以,因为我们进行了分组,所以得用分组函数才可以。
    而case when是分组中的每一行进行判断,其实用几个case看你要将分组中的值分为几种情况。
    像你举得例子,相当于要按照时间进行分组,并且按照正负数分为两组,这样我们就有了一种思路,我们何不分别对正数和负数进行分组函数呢。。所以就有了上面的sql,也满足了你的需求。。
    举个例子你应该会好理解点,你先不考虑分组函数里面的case怎么写。其实就是,时间、sum(value)、sum(value)三个字段,但是这样后两个字段得到的值不是我们想要的,因为我们一个要正数一个要负数,所以只要在里面进行判断就可以得到了,相当于第一个sum对正数进行求和、最大值或者最小值进行分组计算,后一个按照负数进行求和等分组计算。
    这也是比较常用的行转列。。更多的时候我们在分组函数中用decode。。
      

  4.   

    SELECT ACC_DTE,
           SUM(CASE WHEN TRX_AMT > 0 THEN ABS(TRX_AMT) ELSE  NULL END),
           SUM(CASE WHEN TRX_AMT < 0 THEN ABS(TRX_AMT) ELSE  NULL END)
      FROM TAB
     GROUP BY ACC_DTE大神 这SUM值函数是 相加的意思吧?  我感觉SQL的IF ELSE 看起来有点不懂  他这是怎么判断的? 每条数据都进行 这2个判断吗?   例如 第一条 2013-02-15  100块  第一个条件成立 就是100第一个值就是100的绝对值
                        第二条 2013-02-15  -50快   第一个条件不成立 第二个条件成立 就是50  疑惑来了 为什么这么做可以 让他们在同行中 ?????
       2012-02-15  100 50 
    其实那个位置sum、max、min都可以,因为我们进行了分组,所以得用分组函数才可以。
    而case when是分组中的每一行进行判断,其实用几个case看你要将分组中的值分为几种情况。
    像你举得例子,相当于要按照时间进行分组,并且按照正负数分为两组,这样我们就有了一种思路,我们何不分别对正数和负数进行分组函数呢。。所以就有了上面的sql,也满足了你的需求。。
    举个例子你应该会好理解点,你先不考虑分组函数里面的case怎么写。其实就是,时间、sum(value)、sum(value)三个字段,但是这样后两个字段得到的值不是我们想要的,因为我们一个要正数一个要负数,所以只要在里面进行判断就可以得到了,相当于第一个sum对正数进行求和、最大值或者最小值进行分组计算,后一个按照负数进行求和等分组计算。
    这也是比较常用的行转列。。更多的时候我们在分组函数中用decode。。谢谢大神!!