2012-07-03 129 views
3

我目前在SSRS中使用此select語句向最終用戶報告最近需求和庫存天數。類似行的T-SQL總和值

select Issue.MATERIAL_NUMBER, 
SUM(Issue.SHIPPED_QTY)AS DEMAND_QTY, 
Main.QUANTITY_TOTAL_STOCK/SUM(Issue.SHIPPED_QTY) * 122 AS [DOI] 

From AGS_DATAMART.dbo.GOODS_ISSUE AS Issue 
join AGS_DATAMART.dbo.OPR_MATERIAL_DIM AS MAT on MAT.MATERIAL_NUMBER = Issue.MATERIAL_NUMBER 
join AGS_DATAMART.dbo.SCE_ECC_MAIN_FINAL_INV_FACT AS MAIN on MAT.MATERIAL_SID = MAIN.MATERIAL_SID 
join AGS_DATAMART.dbo.SCE_PLANT_DIM AS PLANT on PLANT.PLANT_SID = MAIN.PLANT_SID 

Where Issue.SHIP_TO_CUSTOMER_ID = @CUSTID 
    and Issue.ACTUAL_PGI_DATE > GETDATE() - 122 
    and PLANT.PLANT_CODE = @CUSTPLANT 
    and MAIN.STORAGE_LOCATION = '0001' 
Group by Issue.MATERIAL_NUMBER,Main.QUANTITY_TOTAL_STOCK 

很簡單。

但是,我注意到,他們有相似的材料編號whos值需要結合。

Material | Qty 
0242-55161W 1 
0242-55161  3 

兩個物料編號上方應該合併,並報告爲0242-55161數量4. 如何合併行這樣嗎?這只是需要調整的許多查詢中的1個。可能嗎?

編輯 - 類似的材料將始終是基數加「W」,如果這很重要。

請注意我是SQL和SSRS的新手,這是我第一次在這裏發佈。 讓我知道是否需要包含任何其他細節。

在此先感謝。

答案;

只使用替換,即使在使用SUM時也會返回2個唯一行。 我能夠使用以下方式獲得所需的結果。你能看到這種方法有什麼問題嗎?

with Issue_Con AS 
(
select replace(Issue.MATERIAL_NUMBER,'W','') As [MATERIAL_NUMBER], 
Issue.SHIPPED_QTY AS [SHIPPED_QTY] 

From AGS_DATAMART.dbo.GOODS_ISSUE AS Issue 

Where Issue.SHIP_TO_CUSTOMER_ID = @CUSTSHIP 
and Issue.SALES_ORDER_TYPE_CODE = 'ZTPC'  
and Issue.ACTUAL_PGI_DATE > GETDATE() - 122 
) 

select Issue_Con.MATERIAL_NUMBER, 
SUM(Issue_Con.SHIPPED_QTY)AS [DEMAND_QTY], 
Main_Con.QUANTITY_TOTAL_STOCK/SUM(Issue_Con.SHIPPED_QTY) * 122 AS [DOI] 

From Issue_Con 
join Main_Con on Main_Con.MATERIAL_Number = Issue_Con.MATERIAL_Number 
Group By Issue_Con.MATERIAL_NUMBER, Main_Con.QUANTITY_TOTAL_STOCK; 
+0

將在材料數量的差異始終是一個額外的W' –

+0

是的,通過編輯進行更新。 –

回答

0

你需要用別的東西來代替在選擇和組Issue.MATERIAL_NUMBER。其他的東西取決於你的數據。

  • 如果它總是與任何事後忽略10位,那麼你可以使用substr(Issue.MATERIAL_NUMBER, 1, 10)
  • 如果外來的性格始終是W和沒有WS設爲適當的數量,那麼你可以使用replace(Issue.MATERIAL_NUMBER, 'W', '')
  • 如果它是從第一個字母字符什麼,那麼你可以使用case when patindex('%[A-Za-z]%', Issue.MATERIAL_NUMBER) = 0 then Issue.MATERIAL_NUMBER else substr(Issue.MATERIAL_NUMBER, 1, patindex('%[A-Za-z]%', Issue.MATERIAL_NUMBER)) end
0

,你可以將數據分組通過這種表達,而不是MATERIAL_NUMBER

CASE SUBSTRING(MATERIAL_NUMBER, LEN(MATERIAL_NUMBER), 1) 
    WHEN 'W' THEN LEFT(MATERIAL_NUMBER, LEN(MATERIAL_NUMBER) - 1) 
    ELSE MATERIAL_NUMBER 
END 

也就是說,檢查最後一個字符是否爲W。如果是,則返回除最後一個字符以外的所有字符,否則返回整個值。

爲了避免重複同樣的表達(在SELECTGROUP BY各一次)兩次,你可以使用子查詢,例如像這樣:

select Issue.MATERIAL_NUMBER_GROUP, 
SUM(Issue.SHIPPED_QTY)AS DEMAND_QTY, 
Main.QUANTITY_TOTAL_STOCK/SUM(Issue.SHIPPED_QTY) * 122 AS [DOI] 

From ( SELECT *, CASE SUBSTRING(MATERIAL_NUMBER, LEN(MATERIAL_NUMBER), 1) WHEN 'W' THEN LEFT(MATERIAL_NUMBER, LEN(MATERIAL_NUMBER) - 1) ELSE MATERIAL_NUMBER END AS MATERIAL_NUMBER_GROUP FROM AGS_DATAMART.dbo.GOODS_ISSUE ) AS Issue 
join AGS_DATAMART.dbo.OPR_MATERIAL_DIM AS MAT on MAT.MATERIAL_NUMBER = Issue.MATERIAL_NUMBER 
join AGS_DATAMART.dbo.SCE_ECC_MAIN_FINAL_INV_FACT AS MAIN on MAT.MATERIAL_SID = MAIN.MATERIAL_SID 
join AGS_DATAMART.dbo.SCE_PLANT_DIM AS PLANT on PLANT.PLANT_SID = MAIN.PLANT_SID 

Where Issue.SHIP_TO_CUSTOMER_ID = @CUSTID 
    and Issue.ACTUAL_PGI_DATE > GETDATE() - 122 
    and PLANT.PLANT_CODE = @CUSTPLANT 
    and MAIN.STORAGE_LOCATION = '0001' 
Group by Issue.MATERIAL_NUMBER_GROUP,Main.QUANTITY_TOTAL_STOCK