SQL,group by分组后分别盘算组内差别值的数量

打印 上一主题 下一主题

主题 574|帖子 574|积分 1722

SQL,group by分组后分别盘算组内差别值的数量


如现有一张购物表shopping

先要求小明和小红分别买了多少笔和多少橡皮,形成以下格式

  1. SELECT 'name',COUNT(*)
  2. FROM 'shopping'
  3. GROUP BY 'name';
  4. SELECT name AS 姓名,SUM( CASE WHEN cargo = '笔' THEN 1 ELSE 0 END) AS 笔, SUM(CASE WHEN cargo = '橡皮' THEN 1 ELSE 0 END) AS 橡皮 FROM shopping GROUP BY name;
复制代码
注:这里不能用count盘算行数,count只是分组后每组有行的数目
MySQL中case when then else end 的用法
语法:
CASE
                WHEN condition1 THEN result1
                WHEN condition2 THEN result2
                WHEN conditionN THEN resultN
END;

SElECT
                CASE                                                ----------------------------假如
                WHEN sex = '1' THEN '男'                ----------------------------Sex=‘1’,则返回值‘男’
                WHEN sex = '2' THEN '女'                ----------------------------Sex=‘2’,则返回值‘女’
                ELSE 0                                              ----------------------------其他的返回‘其他’
                ND                                                     ----------------------------竣事
from        user                                                   ----------------------------团体明白:在user表中假如                                                                                                                 sex=‘1’,则返回值‘男’;假如
                                                                                                           sex=‘2’,则返回值‘女
----用法一:
SELECT 
                CASE 
                WHEN STATE = '1' THEN '成功'
                WHEN STATE = '2' THEN '失败'
                ELSE '其他'
            END
FROM  TABLE
---用法二:

SELECT  STATE
                CASE 
                WHEN  '1' THEN '成功'
                WHEN  '2' THEN '失败'
                ELSE '其他'
            END
FROM  table

案例:有员工表empinfo  employee(员工) 

  1. CREATE TABLE 'EMPINFO' (
  2.     'id' INT(11) NOT NULL AUTO_INCREMENT,
  3.     'name' VARCHAR(10) NOT NULL,
  4.     'age' INT(11) NOT NULL,
  5.     'SALARY' INT(11) NOT NULL,
  6.     PRIMARY KEY('id')
  7. )
复制代码
 假如数据量很大约1000万条;写一个你以为最高效的SQL,用一个SQL盘算以下四种人:
salary>9999 and age>35
salary>9999 and age<35
salary<9999 and age>35
salary<9999 and age<35
 每种员工的数量;
  1. SELECT
  2.     SUM(CASE WHEN salary>9999 AND age>35 THEN 1 ELSE 0 END) AS 'salary>9999 age>35',
  3.     SUM(CASE WHEN salary>9999 AND age<35 THEN 1 ELSE 0 END) AS 'salary>9999 age<35',
  4.      SUM(CASE WHEN salary<9999 AND age>35 THEN 1 ELSE 0 END) AS 'salary<9999 age>35',
  5.      SUM(CASE WHEN salary<9999 AND age<35 THEN 1 ELSE 0 END) AS 'salary<9999 age<35'
  6. FROM empinfo;
复制代码
 

 训练:用一个sql语句完成下面差别条件的分组
有如下数据:
 

按照国家和性别进行分组,得出如下效果:

SELECT country,
                SUM ( CASE WHEN sex = '1' THEN
                                                   population ELSE 0 END),
                SUM ( CASE WHEN sex = '2' THEN
                                                   popution ELSE 0 END)
FROM Table_A
GROUP BY country;
根据条件有选择的UPDATE。
例,有如下更新条件
工资5000以上的员工,工资减少10%
工资在2000到4600之间的员工,工资增加15%
很容易思量的是选择实行两次UPDATE语句,如下所示
----条件一:
UPDATE Personnel
        SET salary = salary * 0.9
WHERE salary >= 5000;
----条件二:
UPDATE Personnel
        SET salary = salary*1.15
WHERE salary >= 2000 AND salary < 4600;
但是事变没有想象的那么简朴,假设有个人工资5000块。首先,按照条件1,工资减少10%,酿成工资4500.接下来运行第二个SQL的时候,因为这个人的工资是4500在2000到4600的范围之内,需要增加15%,最后这个人的工资效果是5175,不但没有减少,反而还增加了。假如反过来实行,那么工资4600的人相反会酿成减少工资。暂且不管这个规章是多么怪诞,假如想要一个SQL语句实现这个功能的话,我们需要用到Case函数。代码如下:
  1. UPDATE Personnel
  2.         SET salary = CASE WHEN salary >= 5000 THEN salary * 0.9
  3.                     WHEN salary >= 2000 AND salary < 4600 THEN salary * 1.15
  4.         ELSE salary END;
复制代码
这里要留意一点,最后一行的ELSE salary 是必须的,要是没有这行,不符合这两个条件的人的工资将会被写成NULL,那可就大事不妙了。在Case函数中Else部门的默认值是NULL,这点是需要留意的地方。

  1. update T
  2. set A = case
  3.         when A > 100 then A = A-100
  4.         when A < 100 then A = A+100
  5.         else A end;
复制代码

  1. SELECT courseid, coursename,score,(CASE WHEN score < 60 THEN 'fail' ELSE 'pass' END) AS mark FROM course
复制代码

  1. SELECT DISTINCT 工单,制令号 FROM gomgdan
复制代码

要求统计表gongdan中:工单·+制令号不重复的所有记录的数量
把中央查询到的效果当成一张表使用
  1. SELECT COUNT(*) FROM (SELECT DISTINCT 工单,制令号 FROM gongdan) AS B
复制代码

  1. SELECT salary FROM employee GROUP BY salary DESC LIMIT 1, 1;
复制代码
  1. SELECT IFNULL
  2. ((SELECT salary FROM employee GROUP BY salary DESC LIMIT 1,1),NULL)
  3. AS SecondHighestSalary;
复制代码
IFNULL(expr1,expr2)
假如expr1不是NULL,IFNULL()返回expr1,否则它返回expr2
拷贝表(拷贝数据,源表名:a  目标表名:b)
SQL:insert into b(a,b,c) select d, e, f from a;
insert into b(a,b,c) select a,b,c from b;







免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表