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