0

所以我整天都在寻找解决这个问题的好方法,结果却一无所获。假设我有一个类似的表:

ProjectID Position BilledSoFar NotBilled
---------------------------------------------------------- ------
EE123 AA1 100 200
EE456 MNGR 4000 500
EE123 AA3 43 0
EE012 SPEC1 435 4355
.... .... .... ....

我正在尝试做的是获取具有相同 projectID 的多行,并将所有这些行合并为一个。我需要每个项目 ID 的“Position”“BilledSoFar”和“NotBilled”,即使 ProjectID 不存在 Position,如下所示:

ProjectID
----------------- -------------------------------------------------- ---------------------------------------------
EE123 AA1 100 200 AA3 43 0 MNGR 空 空 ...................

等等。

所以我需要将给定项目 ID 的所有记录放在一行中,即使该项目 ID 不存在位置(上面的示例是 MNGR,它不是 EE123 下的位置)我必须拥有所有位置和计费信息(如果 projectID 不存在该职位,则显然为 NULL)。我已经尝试过枢轴,加入并考虑过联合但仍然无法解决这个问题,而且我在这里的猜测已经不多了。

我还应该注意,我知道有固定数量的投影(比如说 3400),并且有固定数量的位置(假设这个是 20)。

谢谢。

4

2 回答 2

0

您可以使用递归 CTE 将其展平,但这不会将值放入单独的列中,而是将它们放入一个逗号分隔的列中。如果这对您不起作用:

  • 您可以使用非常复杂的动态 SQL 创建来即时执行下一个选项(它只会创建所需的列数(如果不需要构建到 20)
  • 你可以硬编码一个很长的左连接,因为你知道你不会超过 20 行并且只需要一次:

它看起来像这样:

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
  • 正如建议的那样,这应该在客户端应用程序中完成,但如果只完成一次,那么我会使用上面发布的简单复制和粘贴方法
于 2012-05-03T03:53:04.533 回答
0

您可以创建一个接受所需 projectID 作为参数的过程。

使用 CURSOR ( http://justgeeks.blogspot.com/2008/08/using-t-sql-cursor-in-sql-server.html ) 循环遍历与 projectID 匹配的行以构建字段的分隔字符串.

返回字符串或从字符串构建一个选择语句并执行它。

例如,从 CURSOR 构建的要执行的选择字符串:

SELECT 'EE123' AS 'ProjectID',
       'AA1', 
       '100', 
       '200', 
       'AA3', 
       '43', 
       '0', 
       'MNGR', 
       'Null', 
       'Null' 
FROM <tablaname> 
WHERE 1=1
于 2012-05-03T04:19:43.037 回答