SQL pivot table 分层格式的查询和连接查询
SQL pivot table query and hookup query in hierarchical format
Table-1
Resource Rank1 Rank2 Rank3 Rank4
Critical 3 3 6 12
High 8 8 12 24
Table-2
Name Issue SLC
RAM Critical Rank1
KIRAN Critical Rank2
BASS High Rank3
LOUT Critical Rank4
chinna High Rank1
lavanya Critical Rank3
babau High Rank4
rani Critical Rank2
预计应该
Name Issue SLC values RESOURCEMISS
RAM Critical Rank1 3 Resource
KIRAN Critical Rank2 3 Resource
BASS High Rank3 12 Resource
LOUT Critical Rank4 12 Resource
chinna High Rank1 8 Resource
lavanya Critical Rank3 6 Resource
babau High Rank4 24 Resource
rani Critical Rank2 3 Resource
这不应该像 [RESOURCEMISS]='Resoure'
认为你可以尝试这样的事情:
SELECT
Name
Issue
SLC
Values.value
FROM
Table-2
LEFT JOIN
(
SELECT 'Rank1' descrip, Rank1 value FROM Table-1
UNION ALL
SELECT 'Rank2' descrip, Rank1 value FROM Table-1
UNION ALL
SELECT 'Rank3' descrip, Rank1 value FROM Table-1
UNION ALL
SELECT 'Rank4' descrip, Rank1 value FROM Table-1
) as Values
ON Values.descrip = Issue
基于Mysql Convert Column to row (Pivot table )
一个有点难看的解决方案,使用相关子查询来查找每个排名和问题:
SELECT
Name,
Issue,
SLC,
(SELECT CASE WHEN t2.SLC = 'Rank1' THEN t1.Rank1
WHEN t2.SLC = 'Rank2' THEN t1.Rank2
WHEN t2.SLC = 'Rank3' THEN t1.Rank3
WHEN t2.SLC = 'Rank4' THEN t1.Rank4 END
FROM table1 t1
WHERE t1.Resource = t2.Issue) "values"
FROM table2 t2;
我不知道您实际使用的是什么数据库(MySQL 或 SQL 服务器),但考虑到您当前的设计,这可能并不重要。您的模式未规范化,理想情况下,排名数字应该是某个列中某处的实际值,而不是列名本身。 @strawberry 似乎建议对您的设计进行重构,这使得它更容易进行,只使用一个内部连接。
按照以下几行考虑解决方案(坦率地说,与此明显不同的任何内容都是在浪费您的时间):
DROP TABLE IF EXISTS table1;
CREATE TABLE table1
(resource VARCHAR(12) NOT NULL
,slc_rank INT NOT NULL
,val INT NOT NULL
,PRIMARY KEY(resource,slc_rank)
);
INSERT INTO table1 VALUES
('Critical',1,3),
('Critical',2,3),
('Critical',3,6),
('Critical',4,12),
('High',1, 8),
('High',2, 8),
('High',3,12),
('High',4,24);
DROP TABLE IF EXISTS table2;
CREATE TABLE table2
(name VARCHAR(20) NOT NULL
,resource VARCHAR(12) NOT NULL
,slc_rank INT NOT NULL
,PRIMARY KEY(name,resource,slc_rank)
);
INSERT INTO table2 VALUES
('RAM','Critical',1),
('KIRAN','Critical',2),
('BASS','High',3),
('LOUT','Critical',4),
('chinna','High',1),
('lavanya','Critical',3),
('babau','High',4),
('rani','Critical',2);
SELECT x.*
, y.val
FROM table2 x
JOIN table1 y
ON y.resource = x.resource
AND y.slc_rank = x.slc_rank;
+---------+----------+----------+-----+
| name | resource | slc_rank | val |
+---------+----------+----------+-----+
| babau | High | 4 | 24 |
| BASS | High | 3 | 12 |
| chinna | High | 1 | 8 |
| KIRAN | Critical | 2 | 3 |
| lavanya | Critical | 3 | 6 |
| LOUT | Critical | 4 | 12 |
| RAM | Critical | 1 | 3 |
| rani | Critical | 2 | 3 |
+---------+----------+----------+-----+
Table-1
Resource Rank1 Rank2 Rank3 Rank4
Critical 3 3 6 12
High 8 8 12 24
Table-2
Name Issue SLC
RAM Critical Rank1
KIRAN Critical Rank2
BASS High Rank3
LOUT Critical Rank4
chinna High Rank1
lavanya Critical Rank3
babau High Rank4
rani Critical Rank2
预计应该
Name Issue SLC values RESOURCEMISS
RAM Critical Rank1 3 Resource
KIRAN Critical Rank2 3 Resource
BASS High Rank3 12 Resource
LOUT Critical Rank4 12 Resource
chinna High Rank1 8 Resource
lavanya Critical Rank3 6 Resource
babau High Rank4 24 Resource
rani Critical Rank2 3 Resource
这不应该像 [RESOURCEMISS]='Resoure'
认为你可以尝试这样的事情:
SELECT
Name
Issue
SLC
Values.value
FROM
Table-2
LEFT JOIN
(
SELECT 'Rank1' descrip, Rank1 value FROM Table-1
UNION ALL
SELECT 'Rank2' descrip, Rank1 value FROM Table-1
UNION ALL
SELECT 'Rank3' descrip, Rank1 value FROM Table-1
UNION ALL
SELECT 'Rank4' descrip, Rank1 value FROM Table-1
) as Values
ON Values.descrip = Issue
基于Mysql Convert Column to row (Pivot table )
一个有点难看的解决方案,使用相关子查询来查找每个排名和问题:
SELECT
Name,
Issue,
SLC,
(SELECT CASE WHEN t2.SLC = 'Rank1' THEN t1.Rank1
WHEN t2.SLC = 'Rank2' THEN t1.Rank2
WHEN t2.SLC = 'Rank3' THEN t1.Rank3
WHEN t2.SLC = 'Rank4' THEN t1.Rank4 END
FROM table1 t1
WHERE t1.Resource = t2.Issue) "values"
FROM table2 t2;
我不知道您实际使用的是什么数据库(MySQL 或 SQL 服务器),但考虑到您当前的设计,这可能并不重要。您的模式未规范化,理想情况下,排名数字应该是某个列中某处的实际值,而不是列名本身。 @strawberry 似乎建议对您的设计进行重构,这使得它更容易进行,只使用一个内部连接。
按照以下几行考虑解决方案(坦率地说,与此明显不同的任何内容都是在浪费您的时间):
DROP TABLE IF EXISTS table1;
CREATE TABLE table1
(resource VARCHAR(12) NOT NULL
,slc_rank INT NOT NULL
,val INT NOT NULL
,PRIMARY KEY(resource,slc_rank)
);
INSERT INTO table1 VALUES
('Critical',1,3),
('Critical',2,3),
('Critical',3,6),
('Critical',4,12),
('High',1, 8),
('High',2, 8),
('High',3,12),
('High',4,24);
DROP TABLE IF EXISTS table2;
CREATE TABLE table2
(name VARCHAR(20) NOT NULL
,resource VARCHAR(12) NOT NULL
,slc_rank INT NOT NULL
,PRIMARY KEY(name,resource,slc_rank)
);
INSERT INTO table2 VALUES
('RAM','Critical',1),
('KIRAN','Critical',2),
('BASS','High',3),
('LOUT','Critical',4),
('chinna','High',1),
('lavanya','Critical',3),
('babau','High',4),
('rani','Critical',2);
SELECT x.*
, y.val
FROM table2 x
JOIN table1 y
ON y.resource = x.resource
AND y.slc_rank = x.slc_rank;
+---------+----------+----------+-----+
| name | resource | slc_rank | val |
+---------+----------+----------+-----+
| babau | High | 4 | 24 |
| BASS | High | 3 | 12 |
| chinna | High | 1 | 8 |
| KIRAN | Critical | 2 | 3 |
| lavanya | Critical | 3 | 6 |
| LOUT | Critical | 4 | 12 |
| RAM | Critical | 1 | 3 |
| rani | Critical | 2 | 3 |
+---------+----------+----------+-----+