Oracle SQL - ANY 记录的 CASE When 条件
Oracle SQL - CASE When condition for ANY record
我有一个数据库,每次 运行(打开)文档时都会在日志 table 中创建一条记录。每条记录包含 Doc_Name、Doc_Owner 和 Doc_Run_by(即 运行 文档的人)。
我正在尝试创建一个查询以查看每个文档名称,以及它是否已被所有者以外的任何人运行(即是否已共享)。
这是日志 table 的样子:
+----------+-----------+------------+
| 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 |
+----------+--------------+
如您所见,它为每个案例创建了一个单独的记录。我明白为什么要这样做,但我似乎无法弄清楚如何获得我想要的输出。感谢您提供的任何帮助。
这是一个肮脏的把戏,但由于 Y
大于 N
,您可以使用您的查询,将其按 Doc_Name
和 select 分组最大值 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
您可以使用条件聚合:
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'
.
我有一个数据库,每次 运行(打开)文档时都会在日志 table 中创建一条记录。每条记录包含 Doc_Name、Doc_Owner 和 Doc_Run_by(即 运行 文档的人)。 我正在尝试创建一个查询以查看每个文档名称,以及它是否已被所有者以外的任何人运行(即是否已共享)。
这是日志 table 的样子:
+----------+-----------+------------+
| 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 |
+----------+--------------+
如您所见,它为每个案例创建了一个单独的记录。我明白为什么要这样做,但我似乎无法弄清楚如何获得我想要的输出。感谢您提供的任何帮助。
这是一个肮脏的把戏,但由于 Y
大于 N
,您可以使用您的查询,将其按 Doc_Name
和 select 分组最大值 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
您可以使用条件聚合:
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'
.