我正在使用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语句和循环来做到这一点,但这可能效率不高,并且会占用大量资源/时间。是否可以在单个语句中执行此操作?还是写循环是我最好的选择?
答案 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