2016-09-23 4 views
0

일부 정보를 수집하기 위해 쿼리 작업을하고 있으며 약간의 문제가 있습니다.GROUP BY에 포함하지 않고 CASE 문에 무언가를 넣는 방법

본인의 쿼리에서 CASE 문을 사용하여 측정 단위를 살펴보고 단위가 하나인지 다른지 여부에 따라 계산합니다.

내 문제는 내가 특정 레코드를보고있을 때, 단지 1로만 표시하고 싶을 때 2 레코드로 표시하지만 둘 다에서 수치를 합치는 것입니다.

불행하게도 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 

(죄송합니다 여기에 테이블을 할 방법을 잘하지 않음). 한 줄로 표시하려면이 값이 필요하지만 두 값의 합계가 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 줄을 표시하지만 하나는 M2 영향을 두 배로받습니다. – Barnold

0

별도로 영향을받는 쿼리를 계산 해보십시오.

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 개의 선택 쿼리가 작동하면 병합 할 수 있습니다.

관련 문제