如何获取在另一列下分配的列

时间:2018-08-10 09:20:24

标签: mysql sql

我有2张桌子。

这是我的GroupTable。

CREATE TABLE GroupTable(
  ID INT,
  GROUPNAME VARCHAR(50),
  UnderGroupId INT
);

INSERT INTO GroupTable VALUES (1,'A',0);
INSERT INTO GroupTable VALUES (2,'B',1);
INSERT INTO GroupTable VALUES (3,'C',2);
INSERT INTO GroupTable VALUES (4,'D',3);

下面是我要在数据表中传递groupId以供参考的数据表

CREATE TABLE Reference(
  ID INT,
  GROUPID VARCHAR(50),
  GroupValue VARCHAR(50)
);

INSERT INTO Reference VALUES (1,3,'X');
INSERT INTO Reference VALUES (2,4,'Y');
INSERT INTO Reference VALUES (3,1,'Z');

我想显示这样的结果

| ID | GROUPID | GroupValue | GROUPNAME1 | GROUPNAME2 | GROUPNAME3 | GROUPNAME4 |
|----|---------|------------|------------|------------|------------|------------|
|  1 |       3 |          X |          A |          B |          C |            |
|  2 |       4 |          Y |          A |          B |          C |          D |
|  3 |       1 |          Z |          A |            |            |            |

1 个答案:

答案 0 :(得分:1)

根据您的评论,您可以尝试通过OUTER JOIN条件来GROUPID > UnderGroupId,因为该条件就是这两个表的关系条件。

然后

  1. UnderGroupId = 0表示第1组
  2. UnderGroupId = 1表示第2组
  3. UnderGroupId = 2表示第3组
  4. UnderGroupId = 3是指第4组

您可以在UnderGroupId上执行条件聚集函数,以获取透视结果。

TestDLL

CREATE TABLE GroupTable(
  ID INT,
  GROUPNAME VARCHAR(50),
  UnderGroupId INT
);

INSERT INTO GroupTable VALUES (1,'A',0);
INSERT INTO GroupTable VALUES (2,'B',1);
INSERT INTO GroupTable VALUES (3,'C',2);
INSERT INTO GroupTable VALUES (4,'D',3);

CREATE TABLE Reference(
  ID INT,
  GROUPID VARCHAR(50),
  GroupValue VARCHAR(50)
);

INSERT INTO Reference VALUES (1,3,'X');
INSERT INTO Reference VALUES (2,4,'Y');
INSERT INTO Reference VALUES (3,1,'Z');

查询1

SELECT t1.ID,
       t1.GROUPID,  
       t1.GroupValue,
       coalesce(MAX(CASE WHEN UnderGroupId = 0 THEN tt.GROUPNAME end),'') GROUPNAME1,
       coalesce(MAX(CASE WHEN UnderGroupId = 1 THEN tt.GROUPNAME end),'') GROUPNAME2,
       coalesce(MAX(CASE WHEN UnderGroupId = 2 THEN tt.GROUPNAME end),'') GROUPNAME3,
       coalesce(MAX(CASE WHEN UnderGroupId = 3 THEN tt.GROUPNAME end),'') GROUPNAME4
FROM Reference t1 
LEFT JOIN GroupTable tt ON t1.GROUPID > tt.UnderGroupId
GROUP BY t1.ID,
       t1.GROUPID,  
       t1.GroupValue

Results

| ID | GROUPID | GroupValue | GROUPNAME1 | GROUPNAME2 | GROUPNAME3 | GROUPNAME4 |
|----|---------|------------|------------|------------|------------|------------|
|  1 |       3 |          X |          A |          B |          C |            |
|  2 |       4 |          Y |          A |          B |          C |          D |
|  3 |       1 |          Z |          A |            |            |            |