一条SQL语句可输出来自不同表的行

时间:2019-03-20 18:38:56

标签: sql-server

我正在使用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 :(得分:0)

您可以使用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;

答案 1 :(得分:0)

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