【问题标题】:SQL pivot table query and hookup query in hierarchical format分层格式的 SQL 数据透视表查询和连接查询
【发布时间】:2019-07-31 07:40:21
【问题描述】:

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

【问题讨论】:

  • Srikanth 当您提供代码和示例日期时,请选择一个块并按 ctrl-k 进行格式化
  • 任何时候你发现自己有枚举列(例如,2),你可以确定你的架构设计是次优的
  • MySQL 还是 SQL Server,是哪个?
  • sql server 2014

标签: sql-server tsql sql-server-2014


【解决方案1】:

考虑以下方面的解决方案(任何与此明显不同的方法都是在浪费您的时间):

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

【讨论】:

  • 但更大的问题是弗兰克是否真的到处浪费别人的时间:P
  • @TimBiegeleisen 答案是“不”,因为大多数情况下他只是浪费我的:-(
【解决方案2】:

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

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;

Demo

我不知道您实际使用的是什么数据库(MySQL 或 SQL Server),但考虑到您当前的设计,这可能并不重要。您的架构未规范化,理想情况下,排名数字应该是某处列中的实际值,而不是列名本身。 @strawberry 似乎建议对您的设计进行一种重构,这使得它更容易进行,只使用一个内部连接。

【讨论】:

  • 非常感谢您对我的问题给出正确答案,它正在运行 sqlserver。你们节省了我的时间。感谢您的出色工作
【解决方案3】:

觉得你可以试试这样的:

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 )

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2019-07-22
    • 2016-06-22
    • 2012-04-07
    • 1970-01-01
    • 2017-11-21
    • 2011-06-18
    相关资源
    最近更新 更多