我有一个表(JobLog),其中包含有关产品的数据。我希望能够检查是否某些字段可能已经被重新提交并输入了两次,但是之前可能已经被处理过。
我的代码如下:
SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM
JobLog AS A
INNER JOIN (
SELECT ProductCode, AmtHeld
FROM JobLog GROUP BY ProductCode, AmtHeld
HAVING COUNT(*) > 1
) AS B
ON (A.ProductCode = B.ProductCode)
AND (A.AmtHeld = B.AmtHeld)
它输出:
|ProductName | AmtHeld | ProductCode | Disposition|
|------------|---------|-------------|------------|
| chocolate | 123 | 500 | P |
|------------|---------|-------------|------------|
| chocolate | 123 | 500 | C |
|------------|---------|-------------|------------|
| vanilla | 355 | A30 | C |
|------------|---------|-------------|------------|
| vanilla | 355 | A30 | C |
|------------|---------|-------------|------------|
是否有其他方法可以将仅将Disposition = P的行作为行的一部分输出?像这样,我只想要两种巧克力产品的输出,因为它们中的一种具有P的位置,而没有两种香草,因为它们两种都具有C的位置(没有P)。
|ProductName | AmtHeld | ProductCode | Disposition|
|------------|---------|-------------|------------|
| chocolate | 123 | 500 | P |
|------------|---------|-------------|------------|
| chocolate | 123 | 500 | C |
|------------|---------|-------------|------------|
谢谢!
答案 0 :(得分:2)
您可以将条件放在HAVING
子句中:
SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM JobLog AS A INNER JOIN
(SELECT ProductCode, AmtHeld
FROM JobLog
GROUP BY ProductCode, AmtHeld
HAVING COUNT(*) > 1 AND
SUM(IIF(DISPOSITION = 'P', 1, 0)) > 0
) AS B
ON A.ProductCode = B.ProductCode AND
A.AmtHeld = B.AmtHeld
答案 1 :(得分:0)
您可以在查询中添加WHERE EXISTS
子句,以检查表中某处的Disposition
值为P
的产品:
WHERE EXISTS (SELECT *
FROM JobLog A1
WHERE A1.ProductCode = A.ProductCode AND A1.Disposition = 'P')
或者,您可以进行另一个自我加入:
JOIN JobLog C
ON C.ProductCode = A.ProductCode AND C.Disposition = 'P'
答案 2 :(得分:0)
我相信您无需使用汇总即可满足您的要求。您可以简单地使用WHERE EXISTS
条件来确保当前ProductCode / AmtHeld元组至少有两个记录,并且其中一个记录具有处置P。
SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM JobLog AS A
WHERE EXISTS (
SELECT 1 FROM JobLog B
WHERE
A.ProductCode = B.ProductCode
AND A.AmtHeld = B.AmtHeld
AND A.Disposition <> B.Disposition
AND (A.Disposition = 'P' OR B.Disposition = 'P')
)
This DB Fiddle 和示例数据返回:
| ProductName | ProductCode | AmtHeld | Disposition | | ----------- | ----------- | ------- | ----------- | | chocolate | 500 | 123 | P | | chocolate | 500 | 123 | C |