分层格式的SQL枢轴表查询和连接查询

时间:2019-03-09 12:25:34

标签: 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    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'

3 个答案:

答案 0 :(得分:0)

一个有点丑陋的解决方案,使用相关子查询来查找每个等级和问题:

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;

enter image description here

Demo

我不知道您实际使用的是哪个数据库(MySQL或SQL Server),但考虑到当前的设计,它甚至可能无关紧要。您的架构未规范化,理想情况下,等级编号应该是某列中某个列的实际值,而不是列名本身。似乎@strawberry建议对您的设计进行一次重构,从而仅使用一个内部联接就可以更轻松地进行设计。

答案 1 :(得分:0)

请按照以下方式考虑解决方案(任何明显不同的做法都是在浪费您的时间):

awk -F'"' -v val="begin" '
BEGIN{
  OFS=","
}
FNR==1{
  if(val!="begin"){
    print val?val:"NO"
  }
  val=""
}
/data-code/{
  val=(val?val OFS:"")$(NF-1)
}
END{
  print val?val:"NO"
}' *.txt

答案 2 :(得分:-1)

认为您可以尝试以下方法:

decltype

基于Mysql Convert Column to row (Pivot table )