SQL查询:如何在select语句中显示查询的相反结果

时间:2015-06-12 20:09:58

标签: sql

我有点卡在这里,真的希望有人可以帮助我。 我还没找到谷歌的答案。

好的,请说数据如下:

TableName=> Events

| Node_Name| Status    |
+----------+-----------+
| Node_1   | Completed |
| Node_1   | Completed |
| Node_2   | Failed    |
| Node_2   | Completed |
| Node_3   | Failed    |
| Node_3   | Failed    |

查询:

select node_name, count(*)
from events
where status='Failed'
group by node_name

结果:

| Node_2 | 1 |
| Node_3 | 2 |

问题是,如何对从未“失败”并始终完成的node_name进行分组。

查询:?????????

我想要的结果:

=>Node_1

非常感谢您的帮助。

谢谢!

9 个答案:

答案 0 :(得分:2)

在SQL Server中,<option>运算符可以执行此操作。

EXCEPT

说明:您查询所有个不同的节点名称,并删除所有未完成的名称。结果,只剩下那些只能完成的人。

答案 1 :(得分:1)

SELECT
    node_name
FROM
    events
WHERE
    node_name NOT IN (SELECT
                        node_name
                      FROM
                        events
                      WHERE
                        status = 'Failed')
GROUP BY
    node_name

为了防止破坏结果集和jokester,将Abbracadabra添加为状态,您可以使用此功能。专利申请

WITH cteAbbracadabra AS
(
    SELECT
        node_name, status, RANK() OVER (PARTITION BY node_name ORDER BY status) rnk
    FROM
        events
    GROUP BY
        node_name, status
)
SELECT  node_name 
FROM    cteAbbracadabra c
WHERE   status = 'Completed'
        AND NOT EXISTS (
            SELECT  * 
            FROM    cteAbbracadabra 
            WHERE   node_name = c.node_name 
                    AND rnk <> c.rnk)

答案 2 :(得分:0)

select node_name from events group by node_name EXCEPT select node_name from events where status<>'Completed' ; ...

http://sqlfiddle.com/#!6/60887/4

NOT EXISTS

答案 3 :(得分:0)

如果您在一个查询中查找所有状态,请尝试此操作(我使用的是SQL Server 2014):

SELECT
  [Node_Name],
  SUM(CASE WHEN [Status] = 'Failed' THEN 1 ELSE 0 END) AS Failures
FROM (VALUES 
  ('Node_1', 'Completed'),
  ('Node_1', 'Completed'),
  ('Node_2', 'Failed'),
  ('Node_2', 'Completed'),
  ('Node_3', 'Failed'),
  ('Node_3', 'Failed')
  ) x ([Node_Name], [Status])
GROUP BY [Node_Name]

答案 4 :(得分:0)

仅获取“从未失败”的节点:

select node_name
from events
group by node_name
having max(status) = 'Completed'

要使所有节点都有“失败”计数:

select node_name, 
   sum(case when status = 'Failed' then 1 else 0 end )
from events
group by node_name

答案 5 :(得分:0)

您可以创建一个新列,您可以在其中为已完成的列分配“0”值,然后将其他所有值分配给1.然后,只抓取max()值= 0(仅完成)的值:

SELECT t.node_name
FROM (
    SELECT node_name
        ,STATUS
        ,CASE 
            WHEN STATUS = 'Completed'
                THEN 0
            ELSE 1
            END Completed_Flg
    FROM events
    ) t
GROUP BY t.node_name
HAVING max(t.completed_flg) = 0

SQL Fiddle Demo

答案 6 :(得分:0)

SerialPort.ReadExisting

这应该有用,所以在做了一些测试之后我发现我的原始解决方案没有用。但我觉得我现在找到了一个工作模式:

select node_name, count(*)
from events
where count(*) = 
(SELECT count(*) from events where status = 'completed') 
group by node_name; 

因此,这将其显示为显示node_1 2.此时我遇到的问题是能够从最终结果中删除计数。我试图将其包装到另一个子查询中,我只使用in关键字来拉取node_name,但是因为我的子查询到目前为止每个都有两个操作数,所以它不会让我。我将继续尝试找到完成的工作模型,但这有助于推动您朝着正确的方向发展。

SELECT NODE_NAME, COUNT(*) 
FROM EVENTS 
GROUP BY NODE_NAME 
HAVING(NODE_NAME, COUNT(*)) IN 
(SELECT NODE_NAME, COUNT(*) 
FROM EVENTS WHERE
STATUS = 'completed' GROUP BY NODE_NAME);
好吧,我已经设法搞清楚了,我有点傻到没有意识到这一点。

答案 7 :(得分:0)

这可以让你得到你想要的东西

select Distinct Node_Name, COUNT(Node_Name) NodeCount
from events e
where e.Status <> 'Failed'
    AND e.Node_Name NOT IN
    (
        SELECT Node_Name
        FROM events e
        WHERE e.Status <> 'Completed'
    )
GROUP BY Node_Name

返回:

Node_Name | NodeCount
Node_1    | 2

答案 8 :(得分:0)

我已经尝试了几个解决方案。 他们大多数都在工作。但我只需要最简单的一个,因为查询是针对在IBM DB2上运行的Tivoli Storage Manager(TSM)。

我知道最简单的方法可能存在一些缺陷,但我认为TSM不具备适应复杂查询的能力。

感谢您的时间。我很感激。抱歉回复晚了。我不知道回复会这么快。这是我的第一篇文章,我是SQL和TSM的新手:)

因此,在TSM Server中测试SQL查询之后。这很好用:

选择node_name 从事件 group by node_name 有max(状态)=&#39;已完成&#39;