**重新修改了下数据和要求。
左侧上下两个基础表格,通过select建立多表联查,合并生成新的查询结果。
能够在sqlitespy上运行,这破软件好像有些联合不能使用。**
/
/
/
PS:尚未解决,请继续。
根据你的元数据 建立的表和数据
DROP TABLE IF EXISTS `book_1`;
CREATE TABLE `book_1` (
`ID` bigint(11) NOT NULL,
`TYPE_1` varchar(20) DEFAULT NULL,
`NAME` varchar(20) DEFAULT NULL,
`CODE` varchar(20) DEFAULT NULL,
`LEVEL` varchar(20) DEFAULT NULL,
`TYPE_2` varchar(20) DEFAULT NULL,
`NUM` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of book_1
-- ----------------------------
INSERT INTO `book_1` VALUES ('1', '商场', '万达', '0001', '1', '经理', '24');
INSERT INTO `book_1` VALUES ('2', '商场', '万达', '0001', '1', '副经理', '53');
INSERT INTO `book_1` VALUES ('3', '商场', '万达', '0001', '1', '员工', '22');
INSERT INTO `book_1` VALUES ('4', '商场', '之心城', '0002', '1', '经理', '13');
INSERT INTO `book_1` VALUES ('5', '商场', '之心城', '0002', '1', '副经理', '55');
INSERT INTO `book_1` VALUES ('6', '商场', '之心城', '0002', '1', '员工', '5');
-- ----------------------------
-- Table structure for book_2
-- ----------------------------
DROP TABLE IF EXISTS `book_2`;
CREATE TABLE `book_2` (
`ID` bigint(11) NOT NULL,
`TYPE_1` varchar(20) DEFAULT NULL,
`NAME` varchar(20) DEFAULT NULL,
`CODE` varchar(20) DEFAULT NULL,
`LEVEL` varchar(20) DEFAULT NULL,
`TYPE_2` varchar(20) DEFAULT NULL,
`NUM` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of book_2
-- ----------------------------
INSERT INTO `book_2` VALUES ('1', '商场', '之心城', '0002', '1', '大厨', '34');
INSERT INTO `book_2` VALUES ('2', '商场', '之心城', '0002', '1', '打荷', '21');
INSERT INTO `book_2` VALUES ('3', '商场', '之心城', '0002', '1', '白案', '34');
INSERT INTO `book_2` VALUES ('4', '商场', '国贸', '0003', '1', '大厨', '43');
INSERT INTO `book_2` VALUES ('5', '商场', '国贸', '0003', '1', '打荷', '55');
INSERT INTO `book_2` VALUES ('6', '商场', '国贸', '0003', '1', '白案', '22');
以下是sql 怎么用 。Oracle和MySQL 都能用
SELECT
S.TYPE_1 类型,
S. NAME 名称,
S.`CODE` 代码,
SUM(
CASE
WHEN S.TYPE_2 IN ('经理','副经理','员工') THEN S.NUM
ELSE
NULL
END
) AS '一类求和',
SUM(
CASE
WHEN S.TYPE_2 IN ('经理') THEN S.NUM
ELSE
NULL
END
) 经理,
SUM(
CASE
WHEN S.TYPE_2 IN ('副经理') THEN S.NUM
ELSE
NULL
END
) 副经理,
SUM(
CASE
WHEN S.TYPE_2 IN ('员工') THEN S.NUM
ELSE
NULL
END
) 员工,
SUM(
CASE
WHEN S.TYPE_2 IN ('大厨','打荷','白案') THEN S.NUM
ELSE
NULL
END
) '二类总计',
SUM(
CASE
WHEN S.TYPE_2 IN ('大厨') THEN S.NUM
ELSE
NULL
END
) 大厨,
SUM(
CASE
WHEN S.TYPE_2 IN ('打荷') THEN S.NUM
ELSE
NULL
END
) 打荷,
SUM(
CASE
WHEN S.TYPE_2 IN ('白案') THEN S.NUM
ELSE
NULL
END
) 白案
FROM
(
SELECT
ID,
TYPE_1,
NAME,
CODE,
LEVEL,
TYPE_2,
NUM
FROM
book_1
UNION ALL
SELECT
*
FROM
book_2
) S
GROUP BY
S.TYPE_1,
S. NAME,
S.`CODE`
select * from (语句1) a left join (语句2) b on a.部门=b.部门,差不多就是这个逻辑
你把你两个sql发出来,我帮你组合上
这个两边数据都缺的情况,明显的要用 full join啊
SELECT
ifnull( a.区域, B.区域 ) 区域,
ifnull( a.部门, b.部门 ) 部门,
ifnull( a.性质, b.性质 ) 性质,
一级,二级,三级,四级,五级,六级
FROM
A表 a
FULL JOIN B表 b
ON a.区域 = B.区域
AND a.部门 = b.部门
AND a.性质 = b.性质;
题主更改数据库类型为sqlite,此数据库是不支持 full join 的,但可以通过左连接union右连接模拟
SELECT
ifnull( a.区域, B.区域 ) 区域,
ifnull( a.部门, b.部门 ) 部门,
ifnull( a.性质, b.性质 ) 性质,
一级,二级,三级,四级,五级,六级
FROM
A表 a
LEFT JOIN B表 b
ON a.区域 = B.区域
AND a.部门 = b.部门
AND a.性质 = b.性质
UNION
SELECT
ifnull( a.区域, B.区域 ) 区域,
ifnull( a.部门, b.部门 ) 部门,
ifnull( a.性质, b.性质 ) 性质,
一级,二级,三级,四级,五级,六级
FROM
A表 a
RIGHT JOIN B表 b
ON a.区域 = B.区域
AND a.部门 = b.部门
AND a.性质 = b.性质;
或者先构造一个全部区域、部门、性质的数据,以此数据为准去左连接这两个表
select t. 区域,t.部门,t.性质,一级,二级,三级,四级,五级,六级
from (
select 区域 ,部门 ,性质 from A表
union
select 区域 ,部门 ,性质 from B表
) t
left join A表 a on t.区域=a.区域 and t.部门=a.部门 and t.性质=a.性质
left join B表 b on t.区域=b.区域 and t.部门=b.部门 and t.性质=b.性质
select distinct * from (select A.前面几个,B.后面几个 from (语句1) A left join (语句2) B on A. 部门 = B.部门)
可不可以建立一张新的表来存储把一二三四五六属性都加上,然后他的一二三都不为空,四五六可以为空,载把两张表的数据加进去,第一张表的数据直接插,第二章表的数据在第一张的基础上update更新一下后面的四五六
厉害,插个眼