Oracle SQL - CASE当条件为任何记录时

时间:2015-06-23 21:18:26

标签: sql oracle boolean case

我有一个DB,每次运行(打开)文档时都会在日志表中创建一条记录。每条记录都包含Doc_Name,Doc_Owner和Doc_Run_by(即运行文档的人)。 我正在尝试创建一个查询来查看每个文档名称,以及它是否由所有者以外的任何人运行(即是否已经共享)。

以下是日志表的内容:

+----------+-----------+------------+
| Doc_Name | Doc_Owner | Doc_Run_by |
+----------+-----------+------------+
| A        | Bob       | Bob        |
| A        | Bob       | Joe        |
| A        | Bob       | Sam        |
| A        | Bob       | Matt       |
| B        | Matt      | Matt       |
| B        | Matt      | Bob        |
| B        | Matt      | Joe        |
| C        | Sam       | Sam        |
| D        | Bob       | Bob        |
| D        | Bob       | Matt       |
+----------+-----------+------------+

以下是我希望查询输出的内容:

+----------+--------------+
| Doc_Name | Share_Status |
+----------+--------------+
| A        | Y            |
| B        | Y            |
| C        | N            |
| D        | Y            |
+----------+--------------+

就像这样(在伪sql中):

SELECT distinct Doc_Name, 
    CASE 
        WHEN Doc_Owner <> Doc_Run_by for any record of each doc_name
        THEN 'Y'
        ELSE 'N'
    END as Share_Status
FROM Log_Table;

这是我到目前为止所做的:

SELECT distinct Doc_Name, 
    CASE 
        WHEN Doc_Owner <> Doc_Run_by
        THEN 'Y'
        ELSE 'N'
    END as Share_Status
FROM Log_Table;

当前输出:

+----------+--------------+
| Doc_Name | Share_Status |
+----------+--------------+
| A        | Y            |
| A        | N            |
| B        | Y            |
| B        | N            |
| C        | N            |
| D        | Y            |
| D        | N            |
+----------+--------------+

如您所见,它为每个案例创建一个单独的记录。我理解为什么会这样做,但我似乎无法弄清楚如何获得我想要的输出。感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用条件聚合

SELECT Doc_Name, 
       CASE WHEN 
              COUNT(CASE WHEN Doc_Owner <> Doc_Run_by THEN 1 END) > 0 THEN 'Y'
            ELSE 'N'
       END AS Share_Status
FROM Log_Table 
GROUP BY Doc_Name

如果只有一条记录(在Doc_Name记录组中)有Doc_Owner <> Doc_Run_by,那么Share_Status将等于'Y',否则它会相等到'N'

Demo here

答案 1 :(得分:0)

这是一个肮脏的技巧,但由于Y大于N,您可以接受查询,按Doc_Name对其进行分组并选择最大Share_Status

SELECT   Doc_Name, 
         MAX (CASE WHEN Doc_Owner <> Doc_Run_by
                   THEN 'Y'
                   ELSE 'N'
              END) as Share_Status
FROM     Log_Table
GROUP BY Doc_Name