Sql server 分层格式的SQL数据透视表查询和连接查询

Sql 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

表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    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 |
+---------+----------+----------+-----+