簡體   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