簡體   English   中英

類似行的T-SQL和值

[英]T-SQL Sum Values of Like Rows

我目前在SSRS中使用此select語句向最終用戶報告最近需求和庫存天數。

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

很簡單。

但是我注意到它們有類似的材料編號,需要將它們組合起來。

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

上面的兩個材料編號應合並並報告為0242-55161數量4.我如何組合這樣的行? 這只是需要調整的許多查詢中的一個。 可能嗎?

編輯 - 類似的材料將始終是基數加上“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;

您需要使用其他內容替換select和group中的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

您可以使用此表達式而不是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 如果是,則返回除最后一個字符之外的所有字符,否則返回整個值。

為避免重復相同的表達式兩次(一次在GROUP BY ,一次在SELECT ),您可以使用子選擇,例如:

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

暫無
暫無

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

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