Один оператор SQL для вывода строк из разных таблиц - PullRequest
0 голосов
/ 20 марта 2019

Я использую SQL Server 2008 R2 для создания отчета. Отчет должен быть в определенном формате, где у меня есть одна строка из одной таблицы, затем выводятся соответствующие данные из другой, затем другая строка из первой таблицы. Пожалуйста, смотрите мой пример ниже:

Персона Таблица:

pid |   lname | fname
---------------------
1       Smith   John
2       Jones   Doe

salary_history

pid |   salary
1       500000
1       550000
1       570000
2       400000
2       450000

Желаемый вывод:

1       Smith   John
1       500000
1       550000
1       570000
2       Jones   Doe
2       400000
2       450000

Каждая строка в выходных данных представляет собой конкатенацию каждого значения. Так что для строки 1 и строки 2 это будет

person.pid + space(3) + person.lname + space(3) + person.fname + CHAR(13)+CHAR(10) + salary_hisory.pid + space(3) + salary_history.salary

Каждая запись в таблице персонала может содержать сотни соответствующих записей истории зарплат. И там могут быть тысячи записей.

Я могу сделать это, написав инструкцию и цикл T-SQL, но это, вероятно, неэффективно и потребует много ресурсов / времени. Возможно ли сделать это в одном утверждении? Или написание цикла - мой лучший вариант?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019
SELECT  1 AS ReportGroup,
        pid,
        lname + '   ' + fname AS ReportValue
FROM    person
UNION
SELECT  2,
        pid,
        CAST(salary AS VARCHAR(20))
FROM    salary_history
ORDER BY ReportGroup, pid
0 голосов
/ 20 марта 2019

Вы можете unpivot, используя apply:

select distinct p.pid, pp.*
from person p inner join
     salary_history sh
     on sh.pid = p.pid cross apply
     ( values (lname, fname), (cast(salary as varchar(255)), null) 
     ) pp(lname, fname)
order by p.pid, pp.lname desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...