3

現在、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

上記の 2 つの材料番号を組み合わせて、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;
4

2 に答える 2

0

Issue.MATERIAL_NUMBER選択してグループ化する際に、別のものに置き換える必要があります。他の何かが何であるかはあなたのデータに依存します。

  • 常に10桁で、その後は無視される場合は、次を使用できます。substr(Issue.MATERIAL_NUMBER, 1, 10)
  • 無関係な文字が常にWであり、適切な数にWがない場合は、次を使用できます。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
于 2012-07-03T01:29:27.723 に答える
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ます。そうである場合は、最後の文字を除くすべてを返し、そうでない場合は値全体を返します。

GROUP BY同じ式を 2 回 ( で 1 回と で 1回)繰り返さないように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
于 2012-07-03T08:24:42.063 に答える