SQL基础-创建新的输出字段

一、创建新的输出字段

1、建表、插数据

###
CREATE TABLE `t_stock_trans_dtl` (
  `trans_id` varchar(100) NOT NULL COMMENT '交易流水号',
  `stock_name` varchar(20) NOT NULL DEFAULT '' COMMENT '股票名称',
  `stock_code` varchar(10) NOT NULL DEFAULT '' COMMENT '股票代码',
  `opt_tm` datetime NOT NULL DEFAULT '1900-01-01 00:00:00' COMMENT '操作时间',
  `opt_typ` varchar(10) NOT NULL DEFAULT '' COMMENT '操作类型',
  `price` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
  `volume` int(11) NOT NULL DEFAULT '0' COMMENT '数量',
  `fee` decimal(18,5) NOT NULL DEFAULT '0.00000' COMMENT '手续费',
  PRIMARY KEY (`trans_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='股票交易明细';


###
INSERT INTO `t_stock_trans_dtl` VALUES 
('20010406000023','洪都航空','sh600316','2001-04-06 10:42:34','买入',22.40,600,3.36000),
('20050826000303','洪都航空','sh600316','2005-08-26 13:40:31','卖出',6.98,-300,5.00000),
('20130301000933','比亚迪','sz002594','2013-03-01 09:33:36','买入',25.25,600,3.78750),
('20140307000393','比亚迪','sz002594','2014-03-07 13:39:30','买入',56.91,600,8.53650),
('20150508000075','洪都航空','sh600316','2015-05-08 10:47:54','卖出',36.66,-300,2.74950),
('20150724000395','比亚迪','sz002594','2015-07-24 13:19:55','买入',55.55,1200,16.66500),
('20150902000941','大禹节水','sz300021','2015-09-02 09:44:18','买入',11.41,6100,17.40025),
('20160318000314','大禹节水','sz300021','2016-03-18 13:01:44','卖出',12.62,-3000,9.46500),
('20160930000303','比亚迪','sz002594','2016-09-30 13:40:31','卖出',56.98,-2400,34.18800),
('20170310000425','比亚迪','sz002594','2017-03-10 14:22:54','买入',51.59,2000,25.79500),
('20170630000132','大禹节水','sz300021','2017-06-30 11:53:20','买入',7.87,1300,2.55775),
('20171110000142','大禹节水','sz300021','2017-11-10 11:44:24','买入',7.25,5000,9.06250),
('20171229000410','比亚迪','sz002594','2017-12-29 14:51:04','买入',61.88,3600,55.69200);


2、数值计算

比如:
    数据库中数量的单位为股,如何转换为手(1手=100股)后输出?
    SELECT trans_id,stock_name,price,volume,volume/100 FROM t_stock_trans_dtl;

    如何根据股票交易表中的单价、数量,计算出交易金额?
    SELECT trans_id,stock_name,price,volume,price*volume FROM t_stock_trans_dtl;


SQL算术操作符:
    +-*/     除

算术操作符的优先级:
    和数学运算中一样

    SELECT a-b*c/d+1   等价于   SELECT a-((b*C)/d)+1
    建议用( )包起来


算术操作符的结果:
    字段a(INT)= 1
    字段b(INT)= 4
    SELECT a/b        #返回的是0.2500,某些数据库还会返回0

如何返回0.25?
    SELECT a*1.00/b


算术操作符仅支持数值型字段;

如何实现字符型字段的算术操作?
    将字符型转为数值型,再运算


3、字段拼接

比如:
    如何按“洪都航空(sh600316)”展示股票名称和股票代码?

Access、SQL Server中:
    SELECT stock_name + '(' + stock_code + ')' FROM t_stock_trans_dtl;

DB2、Oracle、Teradata中:
    SELECT stock_name || '(' || stock_code || ')' FROM t_stock_trans_dtl;

mysql中:
    SELECT CONCAT(stock_name,'(',stock_code,')') FROM t_stock_trans_dtl;


拼接操作符仅支持字符型字段;

如何实现数值型字段的拼接?
    将数值型转为字符型,再拼接


4、使用别名

SELECT CONCAT(stock_name,'(',stock_code,')') FROM t_stock_trans_dtl;

刚才查询出的拼接字段,表头名称不易读懂,这里可以做一个别名;


使用AS关键字为表达式取一个别名:
    SELECT CONCAT(stock_name,'(',stock_code,')') AS stock FROM t_stock_trans_dtl;

    SELECT CONCAT(stock_name,'(',stock_code,')') AS '股票名称和代码' FROM t_stock_trans_dtl;

建议:不论中文别名中是否有空格,都用引号引起来


二、创建新的输出字段(case when)

1、case when

比如:
    如何根据买入数量,区分大单、中单、小单?
    
      [3000,+∞)     大单
    (300,3000)     中单
    (0,300 ]     小单

    SELECT volume,
    CASE WHEN volume >= 3000 THEN '大单' 
         WHEN volume > 300 AND volume < 3000 THEN '中单' 
         WHEN volume <= 300 THEN '小单' 
    END  as '单的类型'
    FROM t_stock_trans_dtl
    WHERE opt_typ = '买入';

##else关键字
    SELECT volume,
    CASE WHEN volume >= 3000 THEN '大单' 
         WHEN volume > 300 AND volume < 3000 THEN '中单' 
    ELSE '小单' 
    END
    FROM t_stock_trans_dtl
    WHERE opt_typ = '买入';


2、CASE WHEN语法1

###CASE WHEN语法1:

    CASE WHEN 条件表达式1 THEN 结果表达式1
              WHEN 条件表达式2 THEN 结果表达式2 …WHEN 条件表达式N THEN 结果表达式N
    [ELSE ELSE结果表达式]
    END

    没有ELSE部分时,如果所有条件表达式都不满足,则返回NULL。
    每一个CASE WHEN都应该有ELSE分支!!!

比如:
    对于买入的交易,交易数量为正数,而卖出的交易,交易数量为负数。这就导致交易金额(交易价格*交易数量)的返回值有正有负。
    如何根据交易类型做转换,交易金额全部返回正数?

    买入     交易价格*交易数量
    卖出     0-交易价格*交易数量

    SELECT opt_typ,price,volume,
    CASE WHEN opt_typ = '买入' THEN price*volume
              WHEN opt_typ = '卖出' THEN 0-price*volume
    ELSE 0
    END
    FROM t_stock_trans_dtl;

    ##另一种写法
    SELECT opt_typ,price,volume,
    CASE opt_typ
              WHEN '买入' THEN price*volume
              WHEN '卖出' THEN 0-price*volume
    ELSE 0
    END
    FROM t_stock_trans_dtl;


3、CASE WHEN语法2

###CASE WHEN语法2:

    CASE 条件表达式
              WHEN 匹配表达式1 THEN 结果表达式1
              WHEN 匹配表达式2 THEN 结果表达式2 
              ...
              WHEN匹配表达式N THEN 结果表达式N
    [ELSE ELSE结果表达式]
    END

    适用于条件表达式的结果,是一个可穷举的列表。
    但不适用于条件表达式的结果是一个范围的情况。


4、嵌套CASE WHEN

CASE WHEN 外层条件表达式1 THEN (CASE WHEN 内层条件表达式1 THEN 内层结果表达式1 
                                   ...
                                   WHEN 内层条件表达式M THEN 内层结果表达式M
                                   ELSE 内层ELSE结果表达式
                                   END) 
     ...
     WHEN 外层条件表达式N THEN 外层结果表达式N
     ELSE 外层ELSE结果表达式
END

两种语法格式,都可以多层嵌套,但不推荐多层嵌套。
建议最多嵌套两层并使用括号格式化SQL语句。

猜你喜欢

转载自www.cnblogs.com/weiyiming007/p/11428796.html