2016-09-23 7 views
0

私はいくつかの情報を収集するためにクエリを処理していますが、ちょっと立ち往生しています。GROUP BYに含めないでCASE文に何かを入れるには

私の質問では、私はCASE文を使って測定単位を調べ、ユニットがどちらか一方であるかどうかによって計算を行います。

私の問題は、特定のレコードを見ているときに、2つのレコードとして表示されていて、1と表示したいが両方の数字を加算したいということです。

残念ながら、2つのレコードが表示される理由は、私がユニット上にグループを持っていなければならないためです。彼らは異なるので、2行に分かれています。

私のクエリはこれです:

Select 
C.CaseID, 
DATEPART(Year,C.ResolvedDate) 'Year', 
DATENAME(Month,C.ResolvedDate) 'Month', 
CASE 
    WHEN 
     I.ItemGroupID IN ('FGBCTFLR','FGBCTFLD','FGBCTLIS','FGBCTSAM','FGBCTSEC') THEN 'ManufacturedCeramics' 
    WHEN 
     I.ItemGroupID = 'FGBCTGLS' THEN 'ManufacturedGlass' 
    WHEN 
     I.ItemGroupID IN ('FGFACTAG','FGFACTFLD','FGFACTFLR','FGFACTLIS','FGTOOLS') THEN 'Factored' 
End as 'Category', 
COALESCE(CASE WHEN D.UnitID = 'BOX' THEN 
    SUM(D.QtyAffected * I.BCT_Product_Qty/(1/NULLIF((convert(decimal(18,3),I.BCT_Product_Width)/1000 * convert(decimal(18,3),I.BCT_Product_Height)/1000),0))) 
ELSE 
    SUM(D.QtyAffected/(1/NULLIF((convert(decimal(18,3),I.BCT_Product_Width)/1000 * convert(decimal(18,3),I.BCT_Product_Height)/1000),0))) 
End,0) as 'M2 Affected', 
C.CostReplacementTile + C.CostRedelivery + C.CostCredit + C.CostRefixing + C.CostVoucher 'Cost' 

From BCTComplaintRegister C 

Left Join BCTComplaintProductRegister D 
On D.CaseID = C.CaseID 

Left Join InventTable I 
On I.ItemID = D.ItemID 

Left Join BCTTileSize T 
On T.TileSizeID = I.BCTTileSize 

Where 
DATEDIFF(M,C.ResolvedDate,GETDATE()) <= 12 
And C.QAOutcome IN (1,2,5) 
And C.Status = '4' 
AND C.CaseID = 'CE20300' 

Group By 
    DATEPART(Year,C.ResolvedDate), 
    DATENAME(Month,C.ResolvedDate), 
    I.ItemGroupID, 
    C.CaseID, 
    C.CostReplacementTile, 
    c.costredelivery, 
c.costcredit, 
c.costrefixing, 
c.costvoucher, 
d.unitid 

Order By 
    C.CaseId 

結果は以下の通りである。

CaseID: CE20300, CE20300 <br> 
Year: 2016, 2016<br> 
Month: April, April<br> 
Category: ManCer, ManCer<br> 
M2 Affected: 23.56, 0.81 
Cost: 2292, 2292 

(すみません、ここにテーブルを行う方法がわかりません)。 私はこれを1行で表示する必要がありますが、M2を両方の合計値として使用すると、コストは変わらないはずです。

どうすればこの問題を解決できますか?

ご迷惑をおかけして申し訳ございません。

+0

大文字小文字のステートメントではなく、大文字小文字の表現(値を返す)です。 – jarlh

+0

申し訳ありません...... – Barnold

+0

ケース式の_result_でグループ化したいとします。 GROUP BYにCASE文全体を含めるか、サブクエリを使用して外部クエリのカテゴリとグループをマッピングする必要があります。 –

答えて

0

COALESCE式をunitidでグループ化されたサブクエリに変換できますか?

Select 
C.CaseID, 
DATEPART(Year,C.ResolvedDate) 'Year', 
DATENAME(Month,C.ResolvedDate) 'Month', 
CASE 
    WHEN 
     I.ItemGroupID IN ('FGBCTFLR','FGBCTFLD','FGBCTLIS','FGBCTSAM','FGBCTSEC') THEN 'ManufacturedCeramics' 
    WHEN 
     I.ItemGroupID = 'FGBCTGLS' THEN 'ManufacturedGlass' 
    WHEN 
     I.ItemGroupID IN ('FGFACTAG','FGFACTFLD','FGFACTFLR','FGFACTLIS','FGTOOLS') THEN 'Factored' 
End as 'Category', 
sum(D.M2Affected) as 'M2 Affected', 
C.CostReplacementTile + C.CostRedelivery + C.CostCredit + C.CostRefixing + C.CostVoucher 'Cost' 

From BCTComplaintRegister C 

Left Join (select 
COALESCE(CaseID, CASE WHEN D.UnitID = 'BOX' THEN 
    SUM(D.QtyAffected * I.BCT_Product_Qty/(1/NULLIF((convert(decimal(18,3),I.BCT_Product_Width)/1000 * convert(decimal(18,3),I.BCT_Product_Height)/1000),0))) 
ELSE 
    SUM(D.QtyAffected/(1/NULLIF((convert(decimal(18,3),I.BCT_Product_Width)/1000 * convert(decimal(18,3),I.BCT_Product_Height)/1000),0))) 
End,0) as M2Affected 
from BCTComplaintProductRegister group by unitid) D 
On D.CaseID = C.CaseID 

Left Join InventTable I 
On I.ItemID = D.ItemID 

Left Join BCTTileSize T 
On T.TileSizeID = I.BCTTileSize 

Where 
DATEDIFF(M,C.ResolvedDate,GETDATE()) <= 12 
And C.QAOutcome IN (1,2,5) 
And C.Status = '4' 
AND C.CaseID = 'CE20300' 

Group By 
    DATEPART(Year,C.ResolvedDate), 
    DATENAME(Month,C.ResolvedDate), 
    I.ItemGroupID, 
    C.CaseID, 
    C.CostReplacementTile, 
    c.costredelivery, 
c.costcredit, 
c.costrefixing, 
c.costvoucher 

Order By 
    C.CaseId; 
+0

こんにちは、ありがとう。それは仕事のように思えます。つまり、私は現在の結果を私に与えていますが、正しい数字を表示していても線を複製しています。 – Barnold

+0

合計(D.M2Affected)を「影響を受けたM2」として使用できますか? – CGritton

+0

これは2行を表示しますが、1つは影響を受けたM2が2倍になります。 – Barnold

0

M2を計算するためにクエリを分割してください。別途影響を受けます。

SELECT * 
INTO #temp1 
FROM 
(
Select 
C.CaseID, 
DATEPART(Year,C.ResolvedDate) 'Year', 
DATENAME(Month,C.ResolvedDate) 'Month', 
CASE 
    WHEN 
     I.ItemGroupID IN ('FGBCTFLR','FGBCTFLD','FGBCTLIS','FGBCTSAM','FGBCTSEC') THEN 'ManufacturedCeramics' 
    WHEN 
     I.ItemGroupID = 'FGBCTGLS' THEN 'ManufacturedGlass' 
    WHEN 
     I.ItemGroupID IN ('FGFACTAG','FGFACTFLD','FGFACTFLR','FGFACTLIS','FGTOOLS') THEN 'Factored' 
End as 'Category', 

C.CostReplacementTile + C.CostRedelivery + C.CostCredit + C.CostRefixing + C.CostVoucher 'Cost' 

From BCTComplaintRegister C 

Left Join BCTComplaintProductRegister D 
On D.CaseID = C.CaseID 

Left Join InventTable I 
On I.ItemID = D.ItemID 

Left Join BCTTileSize T 
On T.TileSizeID = I.BCTTileSize 

Where 
DATEDIFF(M,C.ResolvedDate,GETDATE()) <= 12 
And C.QAOutcome IN (1,2,5) 
And C.Status = '4' 
AND C.CaseID = 'CE20300' 

Group By 
    DATEPART(Year,C.ResolvedDate), 
    DATENAME(Month,C.ResolvedDate), 
    I.ItemGroupID, 
    C.CaseID, 
    C.CostReplacementTile, 
    c.costredelivery, 
c.costcredit, 
c.costrefixing, 
c.costvoucher, 
d.unitid 
) P 

SELECT 
    COALESCE(CASE WHEN D.UnitID = 'BOX' THEN 
     SUM(D.QtyAffected * I.BCT_Product_Qty/(1/NULLIF((convert(decimal(18,3),I.BCT_Product_Width)/1000 * convert(decimal(18,3),I.BCT_Product_Height)/1000),0))) 
    ELSE 
     SUM(D.QtyAffected/(1/NULLIF((convert(decimal(18,3),I.BCT_Product_Width)/1000 * convert(decimal(18,3),I.BCT_Product_Height)/1000),0))) 
    End,0) as 'M2 Affected' 
INTO #temp2 
FROM BCTComplaintProductRegister D 
Left Join InventTable I 
On I.ItemID = D.ItemID 
Group By 
    D.unitid 

SELECT 
T1.CaseID, 
Year, 
Month, 
Category, 
Cost, 
SUM(T2.[M2 Affected]) AS [M2 Affected] 

FROM #temp1 T1 
INNER JOIN #temp2 T2 
ON T1.CaseID = T2.CaseID 

Group By 
    T1.CaseID, 
    Year, 
    Month, 
    Category, 
    Cost 

Order By 
    C.CaseId 

最後の2つの選択クエリは、機能する場合はマージできます。

関連する問題