尝试在表中查找没有否定记录的唯一记录

时间:2018-07-26 13:37:41

标签: sql sql-server

我有一张桌子,上面有一堆记录。

表如下所示(简化):

ID       DoID          DoQty          DoType          DoValue
1        17            1              Door            15
2        17            -1             Door            -15
3        18            1              Window          75
4        19            1              Bed             125
5        19            1              Bed             134

所以这就是我想要拉的

ID    DoId          DoQty          DoType         DoValue
3      18            1              WIndows        75
4      19            1              Bed            125
5      19            1              Bed            134

我不需要DoID = 17,因为它有第二行,DoQty为-1。所以总体DoQty =0。我只需要没有DoQty = -1的记录。这里的问题是我不想按DoID分组,我希望能够看到整个记录行(无分组依据)

编辑:

不幸的是,我可能没有正确解释我的问题。基本上,如果我运行以下查询,则会得到正确的计数,但是我的目标是获取每一行的详细信息。

SELECT t.DoID, 
'Available' = Sum(t.DoQty)
From t
GROUP BY t.DoID

这给了我无法进行任何处理的分组结果。

6 个答案:

答案 0 :(得分:1)

据我了解,您没有记录在何行中任何负DoQty的记录。如果正确,则可能的解决方法如下,

SELECT t1.ID, t1.DoID, t1.DoQty, t1.DoType, t1.DoValue
FROM table t1
LEFT JOIN table t2 ON t2.DoQty < 0 AND t1.DoID = t2.DoID
WHERE t2.DoID IS NULL 

答案 1 :(得分:0)

这是您想要的吗?

select t.*
from t
where not exists (select 1 from t t2 where t2.doid = t.doid and t2.doqty = - t.doqty);

这会过滤掉存在“负”值的行。

答案 2 :(得分:0)

我们可以在此处使用条件聚合:

WITH cte AS (
    SELECT DoID
    FROM yourTable
    GROUP BY DoID
    HAVING SUM(CASE WHEN DoQty < 0 THEN 1 ELSE 0 END) = 0
)

SELECT *
FROM yourTable
WHERE DoID IN (SELECT DoID FROM cte);

这将返回每个DoID记录组中 not 没有负值的DoQty值。

答案 3 :(得分:0)

  

我在这里要做的只是拉没有DoQty> 0的DoID。

尝试一下...

SELECT DoID
FROM table tbl
WHERE NOT EXISTS (
   SELECT DoID FROM table WHERE DoQty <= 0 AND DoID = tbl.DoID
);

答案 4 :(得分:0)

您可以尝试以下操作:

使用Agg AS

从TableName中选择DOID,sum(DoQty)作为数量
按总和(DoQty)> 0
的DOID分组 )
从TableName T内连接Agg A中选择T. *
在T.DOID = A.DOID;

答案 5 :(得分:0)

您似乎想要:

WebXmlParser parser = new WebXmlParser(false, false, true);