MSSQL从一个数据集创建多个列

MSSQL从一个数据集创建多个列,sql,sql-server,Sql,Sql Server,到目前为止,我已经构建了这个SQL查询。它按预期工作,但不完整 SELECT OPERATION.WORKORDER_BASE_ID As [Work Order] ,OPERATION.SCHED_START_DATE AS [Scheduled Start] ,OPERATION.SETUP_HRS AS [Approx Setup Hrs] ,OPERATION.RUN_HRS AS [Approx Run Hrs] ,

到目前为止,我已经构建了这个SQL查询。它按预期工作,但不完整

SELECT OPERATION.WORKORDER_BASE_ID   As [Work Order]
  ,OPERATION.SCHED_START_DATE    AS [Scheduled Start]
  ,OPERATION.SETUP_HRS           AS [Approx Setup Hrs]
  ,OPERATION.RUN_HRS             AS [Approx Run Hrs]
  ,REQUIREMENT.PART_ID           AS [PSU Card]
FROM  OPERATION
INNER JOIN REQUIREMENT ON REQUIREMENT.WORKORDER_BASE_ID = OPERATION.WORKORDER_BASE_ID
    AND REQUIREMENT.WORKORDER_SUB_ID = OPERATION.WORKORDER_SUB_ID
    AND REQUIREMENT.WORKORDER_LOT_ID = OPERATION.WORKORDER_LOT_ID
WHERE OPERATION.[STATUS] ='R' 
    AND OPERATION.RESOURCE_ID LIKE '%{Root Container.equipmentName}%'
    AND REQUIREMENT.PART_ID LIKE '%PSU%'
棘手的部分是这个需求。part_ID实际上有4列信息。例如当前表中的最后一列将提取包含PSU的值。另一个相邻的列将从包含PCH的同一列中提取数据,我不确定最好的处理方法是什么。工会声明是最好的方式,还是可以通过案例声明来实现

::编辑::

基于这些新信息,我尝试了pivot表和case语句。我不太明白在没有条件语句的情况下,pivot表在这个应用程序中是如何工作的。看来案例陈述会起作用。从这里汲取灵感,我尝试了这个

SELECT OPERATION.WORKORDER_BASE_ID   As [Work Order]
    ,OPERATION.SCHED_START_DATE    AS [Scheduled Start]
    ,OPERATION.SETUP_HRS           AS [Approx Setup Hrs]
    ,OPERATION.RUN_HRS             AS [Approx Run Hrs]
    ,MAX(
        CASE WHEN REQUIREMENT.PART_ID LIKE '%PSU%' 
        THEN REQUIREMENT.PART_ID ELSE '' END 
    ) AS [PSU Card]
    ,MAX(
        CASE WHEN REQUIREMENT.PART_ID LIKE '%PCH%' 
        THEN REQUIREMENT.PART_ID ELSE '' END 
    ) AS [DIE #]      
FROM  OPERATION
INNER JOIN REQUIREMENT ON REQUIREMENT.WORKORDER_BASE_ID = OPERATION.WORKORDER_BASE_ID
    AND REQUIREMENT.WORKORDER_SUB_ID = OPERATION.WORKORDER_SUB_ID
    AND REQUIREMENT.WORKORDER_LOT_ID = OPERATION.WORKORDER_LOT_ID
WHERE OPERATION.[STATUS] ='R' 
    AND OPERATION.RESOURCE_ID LIKE '%{Root Container.equipmentName}%'
    AND REQUIREMENT.PART_ID LIKE '%PSU%'
我收到的错误消息是:

database=FV_VM)@5000ms
On: FV_Recipe_Page.Root Container.Table.data
caused by GatewayException: Column 'OPERATION.WORKORDER_BASE_ID' 
is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.
caused by SQLServerException: Column 'OPERATION.WORKORDER_BASE_ID'
is invalid in the select list because it is not contained in either
an aggregate function or the GROUP BY clause.

温柔点。我知道我的语法是错误的,这就是我问问题的原因。我是SQL新手,从未成功使用过PIVOT或CASE语句。

将行转换为列的概念称为PIVOT。SQL Server有一个可以使用的函数,或者您可以使用CASE聚合函数-有多种方法可以解决这个问题,除了重复的,也可以查看这个问题-我不确定这是否准确地解决了这个问题。我不相信PIVOT函数会起作用,因为数据不是连续的。我曾希望在另一个别名中添加一个引用REQUIREMENT.PART.ID的额外列,并使用CASE语句调整最后一行会起作用,但是我无法获得正确的语法。然后,您应该发布一些示例数据、最终期望的结果以及您尝试获得解决方案的结果。根据您的描述,您应该能够使用pivot来获得结果,但您没有提供在您的问题中不起作用的任何原因。好的,根据您的编辑和语法错误,您的查询缺少GROUP BY子句。聚合数据时,SELECT列表中未聚合的任何列都需要位于GROUPBY子句中。因此,您需要按OPERATION.WORKORDER\u BASE\u ID、OPERATION.SCHED\u START\u DATE、OPERATION.SETUP\u HRS、OPERATION.RUN\u HRS添加组-这将解决您的错误消息。就是这样。谢谢