首页新闻找找看学习计划

帮忙谢谢这条sql语句 急用

0
悬赏园豆:50 [已解决问题] 解决于 2017-08-01 14:02

   oracle数据库 

   表如下

  table acc(
             name      balance     subyearmonth
             A            12       2016
             S            13       2017

             S            32       2017

             A            11       2016

             R            17        2017

             G            34        2016

             A            21        2017

             s            36        2017
 )

查询结果显示  

        name      num1    num2  

注:name显示结果为   把相同的name名字合并   num1和num2显示为相同name的num数值和    其中 num1的数值和为时间是2016年的,num2的数值和为时间为2017年的

长跑的主页 长跑 | 初学一级 | 园豆:11
提问于:2017-08-01 10:18
< >
分享
最佳答案
0
SELECT a.name, num1,num2
FROM 
    (SELECT NAME,SUM(num) AS num1
     FROM acc
         WHERE YEAR ='2016'
         GROUP BY NAME) a LEFT JOIN (SELECT NAME, SUM(num) AS num2
                                     FROM acc
                                     WHERE YEAR ='2017'
                                     GROUP BY NAME) b ON a.name = b.name 
收获园豆:20
Mr___SUN | 菜鸟二级 |园豆:232 | 2017-08-01 11:04
其他回答(4)
0

select a.name ,
(select sum(num) from 表名 where year = 2016 and name = a.name)as 'nums1',
(select sum(num) from 表名 where year = 2017 and name = a.name)as 'nums2'
from 表名 a GROUP BY name

year 是系统关键字 自己加个s  (示例:years)

收获园豆:10
没什么比你更优秀 | 园豆:130 (初学一级) | 2017-08-01 10:33

报错 

支持(0) 反对(0) 长跑 | 园豆:11 (初学一级) | 2017-08-01 10:44

@长跑: 你把题目 改啦

现在的问题如下就可以了:

select a.name ,
(select sum(balance) from 表名 where subyearmonth= 2016 and name = a.name)as 'nums1',
(select sum(balance) from 表名 where subyearmonth= 2017 and name = a.name)as 'nums2'
from 表名 a GROUP BY name

 

你刚刚字段是num,现在是balance,换一下就可以了,还有subyearmonth你刚刚是year,字段不同 所以报错

支持(0) 反对(0) 没什么比你更优秀 | 园豆:130 (初学一级) | 2017-08-01 10:46

@没什么比你更优秀: 改了还是报错   它说找不到from关键字

支持(0) 反对(0) 长跑 | 园豆:11 (初学一级) | 2017-08-01 10:53

@长跑: 你把语句执行和报错结果截图下来看看

支持(0) 反对(0) 没什么比你更优秀 | 园豆:130 (初学一级) | 2017-08-01 11:02
0
SELECT
    t.personname,
    sum(IF(t. YEAR = 2016, s, 0)) AS 2016y,
    sum(IF(t. YEAR = 2017, s, 0)) AS 2017y
FROM
    (
        SELECT
            personName,
            YEAR,
            sum(num) s
        FROM
            acc
        GROUP BY
            personName,
            YEAR
    ) t
GROUP BY
    personname

msyql为例:

DROP TABLE IF EXISTS `acc`;
CREATE TABLE `acc` (
  `personName` varchar(50) DEFAULT NULL,
  `num` int(11) DEFAULT NULL,
  `year` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of acc
-- ----------------------------
INSERT INTO `acc` VALUES ('joey', '1', '2016');
INSERT INTO `acc` VALUES ('joey', '1', '2017');
INSERT INTO `acc` VALUES ('ross', '1', '2016');
INSERT INTO `acc` VALUES ('ross', '1', '2017');
INSERT INTO `acc` VALUES ('joey', '1', '2016');
INSERT INTO `acc` VALUES ('ross', '1', '2016');
会长 | 园豆:6045 (大侠五级) | 2017-08-01 10:43

你这是什么?

支持(0) 反对(0) 长跑 | 园豆:11 (初学一级) | 2017-08-01 10:53

@长跑: 没什么,来骗分的

支持(0) 反对(0) 会长 | 园豆:6045 (大侠五级) | 2017-08-01 11:46
0
select a.name ,
(select sum(balance) from acc where subyearmonth= 2016 and name = a.name)as 'num1',
(select sum(balance) from acc where subyearmonth= 2017 and name = a.name)as 'num2'
from acc as a GROUP BY name
收获园豆:10
金琥 | 园豆:2540 (老鸟四级) | 2017-08-01 11:25
0

select t1.name, t1.sumnum num1, IFNULL(t2.sumnum, 0) num2
from
(select name, subyearmonth,sum(balance) sumnum from acc where subyearmonth= 2016 group by name, subyearmonth) t1
left join
(select name, subyearmonth,sum(balance) sumnum from acc where subyearmonth= 2017 group by name, subyearmonth) t2
on t1.name = t2.name
union
select t5.name,IFNULL(t4.sumnum, 0) sum1, t5.sumnum sum2
from
(select name, subyearmonth,sum(balance) sumnum from acc where subyearmonth= 2016 group by name, subyearmonth) t4
right join
(select name, subyearmonth,sum(balance

) sumnum from acc where subyearmonth= 2017 group by name, subyearmonth) t5
on t4.name = t5.name

亲测可行

收获园豆:10
流年飞雨 | 园豆:1928 (小虾三级) | 2017-08-01 12:43

可以给分啊,可以给你解释一下

支持(0) 反对(0) 流年飞雨 | 园豆:1928 (小虾三级) | 2017-08-01 12:44

用的是mysql的数据库

支持(0) 反对(0) 流年飞雨 | 园豆:1928 (小虾三级) | 2017-08-01 12:51

本人渣渣,写的复杂要死,但意思还是明白的,
总的用union连接两部分,
前半部分是左外连接,查出某个人2016年的数据和2017年的数据(如果有就有,没有就是空的),然后结果处理了一下,如果没有2017年的数据,就为0。这部分查的是2016年数据存在的
后半部分类似是右外连接,查出某个人2017年的数据和2016年的数据(如果有就有,没有就是空的),然后结果也处理了一下,把2016年的数据为空的置为0。这部分查的是2017年数据存在的
最后用了个union,去了一下重(2016,2017年数据均存在的)
就得到了结果,弄了半天,不容易,正确的话给分吧。

支持(0) 反对(0) 流年飞雨 | 园豆:1928 (小虾三级) | 2017-08-01 13:03

话说这题我面试时做过类似的,当时一脸慒逼,脑袋一直浆糊一样

支持(0) 反对(0) 流年飞雨 | 园豆:1928 (小虾三级) | 2017-08-01 13:09

union去重同时也把2016与2017年数据都得到了

支持(0) 反对(0) 流年飞雨 | 园豆:1928 (小虾三级) | 2017-08-01 13:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册