继续水题目,注意左侧两表和右侧查询结果的数据
我用的sqlitespy库,这破东西好像有些联合不支持。
我又来啦!好像跟昨天那个没什么区别
使用 union 或者 union All 的情况
上述例子应该这样写
SELECT
userId AS USER_ID,
NAME AS USER_NAME
FROM
USER UNION
SELECT
MEMBER_USER_ID AS USER_ID,
MEMBER_USER_NAME AS USER_NAME
FROM
PRO_POSITION UNION
SELECT
MNG_USER_ID AS USER_ID,
MNG_USER_NAME AS USER_NAME
FROM
PRO_MNG
本题 的解决 sql
结果数据
t1 表
t2 表
SELECT * FROM T1;
SELECT * FROM T2;
-- 两组数据基本格式一样,而且数据具有相同的内容可以考虑使用union
-- 什么情况下 需要使用union
-- 第一步 合表
SELECT 1 flag, A,B,C,D FROM T1
UNION ALL
SELECT 2 flag,A,B,C,D FROM T2;
-- 第二步 看分组条件
-- 这里是 使用类型 名称 代码 作为分组条件
-- 第三步 看需要的结果列行关系
-- 这里的结果 比原来的表 多了一列 ‘’数量2‘’ 考虑使用行转列
-- 看中间 0002 代码的数据 是表1和表2的数据 放在同一行,但没有聚合运算(sum count max 之类)
-- 最后 分析到 数量1 只展示表1 数据 ,数量2 只展示表2 数据 ,所以在第一步结果中 加上标志位
SELECT
S.A,
S.B,
S.C,-- 第三步 使用case when 增加列
max( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as E,
max( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as F,
sum( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as E,
sum( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as F,
min( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as E,
min( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as F
-- 这里加上 sum的目的是为了配合group by 可以将它改为 max 或者min 均可
FROM-- 第一步 合表
(
SELECT
1 flag,
A,
B,
C,
D
FROM
T1 UNION ALL
SELECT
2 flag,
A,
B,
C,
D
FROM
T2
) S
GROUP BY-- 第二步分组条件
S.A,
S.B,
S.C
CREATE TABLE book1
(id
int(11) NOT NULL AUTO_INCREMENT,code
varchar(256) NOT NULL ,name
varchar(20),
num int(3) not null default 0,
primary key (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into book1(code,name,num) values('0001','万达',24),('0002','之心城',13)
CREATE TABLE book2
(id
int(11) NOT NULL AUTO_INCREMENT,code
varchar(256) NOT NULL ,name
varchar(20),
num int(3) not null default 0,
primary key (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into book2(code,name,num) values('0002','之心城',34),('0003','国贸',22);
select name,code,sum(num1) as 'num1',sum(num2) as 'num2' from (
select name
, code,num as 'num1',0 as num2 from book1
UNION
select name
, code,0 as 'num1',num as 'num2' from book2
) as temp group by code
用 left join 试试,如有帮助,请点击我评论上方【采纳该答案】按钮支持一下。
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`ID` bigint(20) NOT NULL,
`A` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`B` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`C` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`D` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`E` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`F` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t1
-- ----------------------------
INSERT INTO `t1` VALUES (1, '商场', '万达', '0001', '24', NULL, NULL);
INSERT INTO `t1` VALUES (2, '商场', '之心城', '0002', '13', NULL, NULL);
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
`ID` bigint(20) NOT NULL,
`A` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`B` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`C` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`D` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`E` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`F` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t2
-- ----------------------------
INSERT INTO `t2` VALUES (1, '商场', '之心城', '0002', '34', NULL, NULL);
INSERT INTO `t2` VALUES (2, '商场', '国贸', '0003', '22', NULL, NULL);
SELECT
S.A 类型,
S.B 名称,
S.C 代码,-- 第三步 使用case when 增加列
max( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as '数量1',
max( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as '数量2'
-- 这里加上 sum的目的是为了配合group by 可以将它改为 max 或者min 均可
FROM-- 第一步 合表
(
SELECT
1 flag,
A,
B,
C,
D
FROM
T1 UNION ALL
SELECT
2 flag,
A,
B,
C,
D
FROM
T2
) S
GROUP BY-- 第二步分组条件
S.A,
S.B,
S.C;