簡體   English   中英

如何將多行合並為有條件的單行

[英]How to combine multiple rows into single row with condition

我需要有關如何將數據插入具有多個條件的臨時表的幫助。 我有3個相互鏈接的表,而我的問題是每個Amount的AmountIntakeVendorRequisition返回的Amount的值在單行中。 因此,我需要將每個具有相同“ AmountIntakeVendorId”的金額合並到臨時表的Quaters列(Q1,Q2,Q3,Q4)中。 下表是我的案例。 提前致謝!

金額攝入

 ------ ---------------------- --------------- ------------- 
| id   |  AmountIntakeBucketId|     CenterId  |   ProjectId |   
 ------ ---------------------- --------------- ------------- 
|  400 |                 94   |         C1000 |       P100  | 
|  401 |                 95   |         C1001 |       P101  | 
|  402 |                 96   |         C1002 |       P102  | 
|  403 |                 97   |         C1003 |       P103  | 
 ------ ---------------------- --------------- ------------- 

收款人數量

 ------ ----------------- --------------- --------------
| id   |  AmountIntakeId |     VendorId  |   ProjectName| 
 ------ ----------------- --------------- --------------
|  411 |             400 |             1 |    Microsoft | 
|  412 |             400 |             2 |         Dell | 
|  413 |             400 |             4 |       Google | 
|  414 |             400 |             4 |       Huawei | 
 ------ ----------------- ---------------- -------------

收款人數量請購單

  ------ ----------------------  ---------------------------- -------------------------- ------------
| id   |  AmountIntakeVendorId|                    StartDt |                    EndDt |    Amount   |
 ------ ---------------------- ---------------------------- -------------------------- -------------
| 1771 |                  411 |    2019-04-01 00:00:00.000 |  2019-06-30 23:59:59.000 |     1000.00 |
| 1772 |                  411 |    2019-07-01 00:00:00.000 |  2019-09-31 23:59:59.000 |     1430.00 |
| 1773 |                  411 |    2019-10-01 00:00:00.000 |  2019-12-31 23:59:59.000 |     2000.00 |
| 1774 |                  412 |    2019-07-01 00:00:00.000 |  2019-09-31 23:59:59.000 |     5000.00 |
 ------  ---------------------- --------------------------- -------------------------- -------------

預期結果

 ----------- ----------------------  ------------ -------------- ------------- ------------- 
| ProjectId |          ProjectName |          Q1 |           Q2 |          Q3 |          Q4 |        
 ----------- ---------------------- ------------- -------------- ------------- ------------- 
|      P100 |            Microsoft |        NULL |      1000.00 |    1430.00  |     2000.00 |  
|      P101 |                 Dell |        NULL |      5000.00 |        NULL |        NULL |         
 ----------  ---------------------- ------------- -------------- ------------- ------------- 

我已經創建了用於插入數據的表,但是對於將每個Quaters(Q1,Q2,Q2,Q4)的'Amount'插入到@tempTable中,我一直處於停留狀態

  DECLARE @AIBId Int = 94
  DECLARE @tempTable TABLE            
 (            
  ProjectId INT,            
  ProjectName NVARCHAR(100),              
  Q1 DECIMAL (12,2), --1
  Q2 DECIMAL (12,2), -- 4
  Q3 DECIMAL (12,2), --7
  Q4 DECIMAL (12,2)  --10    
 )       

INSERT into @tempTable
SELECT *
AI.ProjectId,
AIV.ProjectName,
Month(AISR.StartDate) AS Quater,
CASE Quater
WHEN 1 THEN AISR.Amount
WHEN IS NULL THEN NULL
END AS Q1
CASE Quater
WHEN 4 THEN AISR.Amount
WHEN IS NULL THEN NULL
END AS Q2
CASE Quater
WHEN 7 THEN AISR.Amount
WHEN IS NULL THEN NULL
END AS Q3
CASE Quater
WHEN 10 THEN AISR.Amount
WHEN IS NULL THEN NULL
END AS Q4
END 
FROM AmountIntake AI
LEFT JOIN AmountIntakeVendor AIV on AI.Id = AIV.AmountIntakeId
LEFT JOIN AmountIntakeVendorRequisition AIVR on AIV.ID = AIVR.AmountIntakeVendorId
WHERE AI.AmountIntakeBucketId = @AIBId 

SELECT * from @tempTable

您的select查詢看起來不錯,只需進行少量更新即可-

SELECT AI.ProjectId
      ,AIV.ProjectName
      ,Month(AISR.StartDate) AS Quater
      ,CASE Month(AISR.StartDate) WHEN 1 THEN AIVR.Amount END AS Q1
      ,CASE Month(AISR.StartDate) WHEN 4 THEN AIVR.Amount END AS Q2
      ,CASE Month(AISR.StartDate) WHEN 7 THEN AISR.Amount END AS Q3
      ,CASE Month(AISR.StartDate) WHEN 10 THEN AISR.Amount END AS Q4
FROM AmountIntake AI
LEFT JOIN AmountIntakeVendor AIV on AI.Id = AIV.AmountIntakeId
LEFT JOIN AmountIntakeVendorRequisition AIVR on AIV.ID = AIVR.AmountIntakeVendorId
WHERE AI.AmountIntakeBucketId = @AIBId

如果CASE語句不符合條件,則會自動分配NULL,因此無需顯式分配它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM