我有一个数据库,让一个雇员,工作,一个EFFECTIVEDATE和部门。如果员工工作多于一份工作,他们将获得额外的一行数据。我的目标是将与每个员工相对应的行压缩成一个。基本上,我需要一个查询到,从一个数据库,看起来像这样拉:迭代在SQL Server 2008中的SELECT语句中使用while循环
要输出这样EmpID Job EffDate Dept
001 QB 01-01-2001 OFF
001 LB 01-01-2010 DEF
001 K 01-01-2005 SPEC
002 HC 01-01-2007 STAFF
003 P 01-01-2001 SPEC
003 CB 01-01-2002 DEF
:
EmpID Job1 EffDate1 Dept1 Job2 EffDate2 Dept2 Job3 EffDate3 Dept3
001 QB 01-01-2001 OFF K 01-01-2005 SPEC LB 01-01-2010 DEF
002 HC 01-01-2007 STAFF
003 P 01-01-2001 SPEC CB 01-01-2002 DEF
到目前为止,我已经做到了这一点:
SELECT
EmpNo
, Job
, EffDate
, Dept
, ROW_NUMBER() OVER (PARTITION BY EmpNo ORDER BY EffDate) AS RowNum
INTO #temp1
FROM JobHist
ORDER BY EffDate DESC
SELECT
JobHist.EmpNo
, JobHist.Job AS Job1
, JobHist.EjhJobDesc AS JobDesc1
, JobHist.EffDate AS EffDate1
, JobHist.Dept AS Dept1
, temp2.Job AS Job2
, temp2.EffDate AS EffDate2
, temp2.Dept AS Dept2
FROM #temp1 AS JobHist LEFT JOIN #temp1 AS temp2 ON JobHist.EmpNo = temp2.EmpNo AND temp2.RowNum = 2
WHERE JobHist.RowNum = 1
而且这工作得很好。问题是我需要制作很多列,而且我不想将所有代码编写20次。所以我想通过使用WHILE命令进行迭代。以下是我在第二个SELECT语句的尝试:
DECLARE @Flag INT
DECLARE @FlagPlus INT
SET @Flag = 1
SET @FlagPlus = (@Flag + 1)
WHILE(@Flag < 20)
BEGIN
SELECT
[email protected]
, [email protected] AS [email protected]
, [email protected] AS [email protected]
, [email protected] AS [email protected]
, [email protected] AS [email protected]
FROM #temp1 AS [email protected]
LEFT JOIN #[email protected] AS [email protected]
ON [email protected] = [email protected] AND [email protected] = @FlagPlus
WHERE JobHist.RowNum = 1
SET @Flag = (@Flag + 1)
SET @FlagPlus = (@FlagPlus + 1)
END
我知道这可能是行不通的,因为SQL不理解的命名约定我想打电话给每个表和字段。有没有使用强制或CONCAT命令所以它只是增加在那里,我要求它的数字我可以自动处理的方法吗?
我认为你需要退后一步,试图解决更大的问题,而不是尝试解决循环。你究竟在做什么*试图做什么?为什么你需要一个#temp表?这看起来像一个非常简单的数据透视查询(或者您可以在客户端上转置的东西)。 –
你想要的实际上是一个动态数据透视表,它需要动态的sql – ClearLogic
@AaronBetrand我需要修改这个表格来查询我正在构建的另一个查询。我需要知道在特定日期某个部门工作的人员。有时候工作会改变,但部门不会。我的下一个查询需要按顺序比较作业。它正在建立在Cognos。将dept1与dept2进行比较要容易得多,然后在给定的日期查看是否在dept1中使用,如果所有条目都是这样旋转的。不能在客户端进行转置,因为它只是将要交付的更大报表的一小部分。 –