所以我整天都在寻找一个解决这个问题的好方法,并且空洞了。假设我有一张类似于此的表:
ProjectID职位BilledSoFar NotBilled
-------------------------------------------------- -
EE123 AA1 100 200
EE456 MNGR 4000 500
EE123 AA3 43 0
EE012 SPEC1 435 4355
.... .... .... ....
我试图做的是使用相同的projectID获取多行,并将所有这些行合并为一行。我需要每个项目ID的“位置”“BilledSoFar”和“NotBilled”,即使项目ID的位置不存在,如下所示:
专案编号
---------------------------------------------- -------------------------------------------------- ----------------
EE123 AA1 100 200 AA3 43 0 MNGR Null Null ..............
等等。
所以我需要将给定项目ID的所有记录放入一行,即使该projectID的位置不存在(上面的示例是MNGR,这不是EE123下的位置)我必须拥有所有职位和账单信息(如果projectID不存在,那么显然是NULL)。我已经尝试过枢轴,连接,并考虑了一个联盟,但仍然无法解决这个问题,而且我在这里已经没有猜测了。
我还应该注意到,我知道有一定数量的项目(假设是3400)并且有一定数量的职位(假设这个职位为20)。
感谢。
答案 0 :(得分:0)
您可以使用递归CTE将其展平,但是这不会将值放入单独的列中,而是将它们放在一个以逗号分隔的列中。如果这不适合你:
它看起来像这样:
SELECT ProjectID, Position, BilledSoFar, NotBilled,
ROW_NUMBER() OVER (PARTITION BY ProjectID ORDER BY Position) AS RowNum
INTO #ProjectTable
FROM ProjectTable
SELECT ProjectTable.ProjectID,
ProjectTable.Position AS Position1, ProjectTable.BilledSoFar AS BilledSoFar1,
ProjectTable.NotBilled AS NotBilled1,
ProjectTable2.Position AS Position2, ProjectTable2.BilledSoFar AS BilledSoFar2,
ProjectTable2.NotBilled AS NotBilled2,
...
ProjectTable20.Position AS Position20, ProjectTable20.BilledSoFar AS BilledSoFar20,
ProjectTable20.NotBilled AS NotBilled20
FROM #ProjectTable AS ProjectTable
LEFT JOIN #ProjectTable AS ProjectTable2
ON ProjectTable.ProjectID = ProjectTable2.ProjectID AND ProjectTable2.RowNum = 2
...
LEFT JOIN #ProjectTable AS ProjectTable20
ON ProjectTable.ProjectID = ProjectTable20.ProjectID AND ProjectTable20.RowNum = 20
WHERE ProjectTable.RowNum = 1
答案 1 :(得分:0)
您可以创建一个接受所需projectID作为参数的过程。
使用游标(http://justgeeks.blogspot.com/2008/08/using-t-sql-cursor-in-sql-server.html) 循环遍历与projectID匹配的行,以构建字段的分隔字符串。
返回字符串或从字符串构建一个select语句并执行它。
例如,要执行从CURSOR构建的选择字符串:
SELECT 'EE123' AS 'ProjectID',
'AA1',
'100',
'200',
'AA3',
'43',
'0',
'MNGR',
'Null',
'Null'
FROM <tablaname>
WHERE 1=1