SQL CASE混淆了我的分组
问题描述:
问题座落在自己的SELECT语句的4号线:CASE WHEN ct.TransactionReason=622 THEN ABS(ct.netquantity) ELSE c.RealNetWeight END AS NetWeight
SQL 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
答
硬然而不理解你的表结构来回答,似乎CoilTransaction
是某种交易表,即单品可以有很多的交易。
在你SELECT
查询,线路造成你的问题,是引用您CoilTransaction
表因此,我认为,你返回多行的原因是因为你在不唯一的值分组中唯一的一行。另外,交易是单个项目,因为您似乎在表格上有一个数量列。
简而言之,通过在事务表中包含这些列,您无法获得所需的分组。您需要更详细地阐述您想要为我们提供更合适的解决方案。这条线意味着什么?
答
对于表Coil
至少一个CoilID
,你会在表CoilTransaction
在该领域netquantity
多个值。这是当您在CASE
声明中包含此字段时返回的记录数量增加的原因。
我会建议您在CTE中找到您想要的netquantity
值CoilTransaction
,然后将它带入您的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
)
...
如何删除组中的CASE WHEN列,并将其替换为NetWeight列? – StackTrace
然后它会给我一个关于ct.transactionreason和ct.netquantity不在GROUP BY或AGGREGATE函数中的错误。 –
您需要将它们添加到组中或在聚合子句中。所以,如果你有不同的'c.realnetweight'哪一个应该显示在你的'一行' - 更小,最大或什么? – gotqn