Sql server 分层格式的SQL数据透视表查询和连接查询
表1Sql server 分层格式的SQL数据透视表查询和连接查询,sql-server,tsql,sql-server-2014,Sql Server,Tsql,Sql Server 2014,表1 Resource Rank1 Rank2 Rank3 Rank4 Critical 3 3 6 12 High 8 8 12 24 表2 Name Issue SLC RAM Critical Rank1 KIRAN Critical Rank2 BASS High Rank3 LOUT Crit
Resource Rank1 Rank2 Rank3 Rank4
Critical 3 3 6 12
High 8 8 12 24
表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]='resource'
您可以尝试这样的方法:
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
基于有点丑陋的解决方案,使用相关子查询查找每个排名和问题:
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 Server),但考虑到您当前的设计,这可能并不重要。您的模式没有规范化,理想情况下,秩号应该是某个列中的实际值,而不是列名本身。似乎@草莓已经建议对您的设计进行一次重构,只需使用一个内部连接,就可以更轻松地进行重构。考虑以下解决方案(与此明显不同的任何方案都是在浪费您的时间):
Srikanth当您呈现代码和示例日期时,请选择一个块并按ctrl kAny设置格式。当您发现自己有枚举列时(如上,例如,2),您可以确保您的模式设计是次优的MySQL或SQL Server,是哪一个?sql server 2014但更大的问题是Frank是否真的在浪费别人的时间:P@TimBiegeleisen答案是“不”,因为他大部分时间都在浪费我的时间:-(非常感谢你对我的问题给出了正确的答案,它正在运行sqlserver。你们节省了我的时间。谢谢你们的出色工作
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 |
+---------+----------+----------+-----+