Запрос сводной таблицы SQL и запрос подключения в иерархическом формате - PullRequest
0 голосов
/ 09 марта 2019

Таблица-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 голосов
/ 09 марта 2019

Несколько уродливое решение, использующее коррелированный подзапрос для поиска каждого ранга и выпуска:

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

Демонстрация

Я не знаю, какую базу данных вы на самом деле используете (MySQL или SQL Server), но это может даже не иметь большого значения, учитывая ваш текущий дизайн.Ваша схема не нормализована, и в идеале порядковый номер должен быть где-то в реальном столбце, а не в самом имени столбца.Похоже, что @strawberry предложила один рефакторинг вашего дизайна, который упрощает процесс, используя только одно внутреннее соединение.

0 голосов
/ 09 марта 2019

Рассмотрите решение по следующим направлениям (все, что заметно отличается от этого, откровенно тратит ваше время):

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 |
+---------+----------+----------+-----+
0 голосов
/ 09 марта 2019

Думаю, вы могли бы попробовать что-то вроде этого:

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 Конвертировать столбец в строку (сводная таблица)

...