SQL CASE混淆了我的分组

问题描述:

问题座落在自己的SELECT语句的4号线:CASE WHEN ct.TransactionReason=622 THEN ABS(ct.netquantity) ELSE c.RealNetWeight END AS NetWeightSQL CASE混淆了我的分组

当我加入这一行的声明,我的分组会改变。现在它不是返回一行,而是现在给我返回不同c.realnetweight的行数。 问题是我只想返回一行。有点像一个合并,当有一个ct.transactionreason = 622,它应该给我ABS(ct.netquantity),否则c.realnetweight。代码可以在下面找到,建议将非常有帮助。谢谢。

SELECT CASE WHEN P.Wrapped = 1 THEN T.[Level]+1 ELSE T.[Level] END AS [Level] 
     , @CoilId AS CoilId 
     , c.SupplierCoilID 
     , CASE WHEN ct.TransactionReason=622 THEN ABS(ct.netquantity) ELSE c.RealNetWeight END AS NetWeight 
     , C.RealGrossWeight 
     , p1.Description 
     , p1.product 
     , s.StackID 
     , s.ProductID 
     , s.Weight 
     , P.Product 
     , P.Description AS 'ProductDescription' 
     , COUNT(t.BlankId) AS 'NumberOfBlanks' 
     , c1.Description as 'Status' 
     , pv.ProductionWeight 
     , pv.BlankWeight 
     , t.BlankStatus 

FROM @Trace T 
    INNER JOIN SKUTraceability SKUT ON SKUT.SKUID = T.SKUID 
    INNER JOIN Stack s ON SKUT.StackID = s.StackID 
    INNER JOIN Product p ON s.ProductID = p.ProductID 
    INNER JOIN Coil c ON [email protected] 
    INNER JOIN CoilTransaction ct on [email protected] 
    INNER JOIN Product p1 ON c.ProductID=p1.ProductID 
    INNER JOIN Code c1 ON t.BlankStatus=c1.codenumber AND c1.codetypeid=17 
    INNER JOIN @ProductVersion pv ON pv.ProductID=p.ProductId AND s.ProductVersion = pv.ProductVersion 

WHERE t.BlankId IS NOT NULL 

GROUP BY T.[Level] 
     , c.SupplierCoilID 
     , CASE WHEN ct.TransactionReason=622 THEN ABS(ct.netquantity) ELSE c.RealNetWeight END 
     , c.RealGrossWeight 
     , p1.Description 
     , p1.product 
     , s.StackID 
     , s.ProductID 
     , s.Weight 
     , p.Product 
     , p.Description 
     , c1.Description 
     , pv.ProductionWeight 
     , pv.BlankWeight 
     , p.Wrapped 
     , t.BlankStatus 
+0

如何删除组中的CASE WHEN列,并将其替换为NetWeight列? – StackTrace

+1

然后它会给我一个关于ct.transactionreason和ct.netquantity不在GROUP BY或AGGREGATE函数中的错误。 –

+1

您需要将它们添加到组中或在聚合子句中。所以,如果你有不同的'c.realnetweight'哪一个应该显示在你的'一行' - 更小,最大或什么? – gotqn

硬然而不理解你的表结构来回答,似乎CoilTransaction是某种交易表,即单品可以有很多的交易。

在你SELECT查询,线路造成你的问题,是引用您CoilTransaction表因此,我认为,你返回多行的原因是因为你在不唯一的值分组中唯一的一行。另外,交易是单个项目,因为您似乎在表格上有一个数量列。

简而言之,通过在事务表中包含这些列,您无法获得所需的分组。您需要更详细地阐述您想要为我们提供更合适的解决方案。这条线意味着什么?

对于表Coil至少一个CoilID,你会在表CoilTransaction在该领域netquantity多个值。这是当您在CASE声明中包含此字段时返回的记录数量增加的原因。

我会建议您在CTE中找到您想要的netquantityCoilTransaction,然后将它带入您的CASE声明。例如:

;WITH transaction_summary AS (
SELECT 
    ct.CoilID, 
    ct.TransactionReason, 
    MAX(ct.netquantity) -- choose your aggregate function here 
FROM 
    CoilTransaction ct 
GROUP BY 
    ct.CoilID, 
    ct.TransactionReason 
) 
...