mysql之select多条件两表联查,合并生成新的查询结果

**重新修改了下数据和要求。

img

左侧上下两个基础表格,通过select建立多表联查,合并生成新的查询结果。
能够在sqlitespy上运行,这破软件好像有些联合不能使用。**
/
/
/

PS:尚未解决,请继续。

img

img

img

根据你的元数据 建立的表和数据

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更新一下后面的四五六

厉害,插个眼