繁体   English   中英

SQL查询 - 将2行合并为1行

[英]SQL Query - combine 2 rows into 1 row

我在SQL Server中有以下查询(视图)。 该查询生成填充网格所需的结果集。 但是,在用户希望在我们的应用中的一行上看到数据时,出现了新的要求。 tblTask​​s表可以生成1或2行。 当问题是两行具有相同的job_number但fldProjectContextId(1或31)不同时,问题就出现了。 我需要在一行而不是两行上获取MechApprovalOut和ElecApprovalOut列。

我尝试使用CTE和over partition重构查询,但是无法获得我需要的必要结果。

SELECT TOP (100) PERCENT
       CAST(dbo.Job_Control.job_number AS int) AS Job_Number,
       dbo.tblTasks.fldSalesOrder, dbo.tblTaskCategories.fldTaskCategoryName,
       dbo.Job_Control.Dwg_Sent, dbo.Job_Control.Approval_done,
       dbo.Job_Control.fldElecDwgSent, dbo.Job_Control.fldElecApprovalDone,
       CASE WHEN DATEDIFF(day, dbo.Job_Control.Dwg_Sent, GETDATE()) > 14
             AND dbo.Job_Control.Approval_done IS NULL
             AND dbo.tblProjectContext.fldProjectContextID = 1
            THEN 1 ELSE 0
        END AS MechApprovalOut,
       CASE WHEN DATEDIFF(day, dbo.Job_Control.fldElecDwgSent, GETDATE()) > 14
             AND dbo.Job_Control.fldElecApprovalDone IS NULL
             AND dbo.tblProjectContext.fldProjectContextID = 31
            THEN 1 ELSE 0
        END AS ElecApprovalOut,
       dbo.tblProjectContext.fldProjectContextName,
       dbo.tblProjectContext.fldProjectContextId, dbo.Job_Control.Drawing_Info,
       dbo.Job_Control.fldElectricalAppDwg
  FROM dbo.tblTaskCategories
       INNER JOIN dbo.tblTasks
          ON dbo.tblTaskCategories.fldTaskCategoryId = dbo.tblTasks.fldTaskCategoryId
       INNER JOIN dbo.Job_Control
          ON dbo.tblTasks.fldSalesOrder = dbo.Job_Control.job_number
       INNER JOIN dbo.tblProjectContext
          ON dbo.tblTaskCategories.fldProjectContextId = dbo.tblProjectContext.fldProjectContextId
 WHERE (dbo.tblTaskCategories.fldTaskCategoryName = N'Approval'
       OR dbo.tblTaskCategories.fldTaskCategoryName = N'Re-Approval')
   AND (CASE WHEN DATEDIFF(day, dbo.Job_Control.Dwg_Sent, GETDATE()) > 14
              AND dbo.Job_Control.Approval_done IS NULL
              AND dbo.tblProjectContext.fldProjectContextID = 1
             THEN 1 ELSE 0
          END = 1)
    OR (dbo.tblTaskCategories.fldTaskCategoryName = N'Approval'
       OR dbo.tblTaskCategories.fldTaskCategoryName = N'Re-Approval')
   AND (CASE WHEN DATEDIFF(day, dbo.Job_Control.fldElecDwgSent, GETDATE()) > 14
              AND dbo.Job_Control.fldElecApprovalDone IS NULL
              AND dbo.tblProjectContext.fldProjectContextID = 31
             THEN 1 ELSE 0
         END = 1)
 ORDER BY dbo.Job_Control.job_number, dbo.tblTaskCategories.fldProjectContextId

上面的查询给出了以下结果集: 在此输入图像描述

我已经通过代码创建了一个解决方案(我不喜欢,但它现在可以工作),我用代码填充“临时”表,就像我需要它来显示数据一样,即一条记录如果重复的作业编号在一行上获取MechApprovalOut和ElecApprovalOut列(请参阅下面的屏幕截图中的第一条记录)。

例: 在此输入图像描述

使用所需的结果集和每个job_number一行,这是表单查看数据的方式以及我如何使用结果集。

在此输入图像描述

任何帮助重组我的查询以将重复的行与MechApprovalOut和ElecApproval列在一行中的相同作业编号组合在一起非常感谢! 我更喜欢使用SQL上的视图然后在应用程序中编写代码来填充临时表。

谢谢,吉米

我要做的是在查询开始时将主表LEFT JOIN连接到自身,匹配Job Number和Sales Order,这样连接的左侧只查看Approval任务类别,而连接的右侧是仅查看Re-Approval任务类别。 然后,我将广泛使用COALESCE()函数从连接的正确一侧选择数据,以便稍后在select子句中使用。 这也可能是您在CTE工作中所缺少的部分。

可能还有一个解决方案使用排名/窗口函数(可能不是RANK本身,但类别的东西)以及PARTITION BY子句。 但是,由于这些对于Sql Server来说还是比较新的,所以我没有足够的个人使用它们来为你编写一个示例解决方案,而无需直接访问要使用的数据,这仍然需要我多一点时间才能正确使用我现在可以投入到这个。 也许这一段会激励别人去做那项工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM