我有一个类似的表格:
|ID| |Error| |Subject| |Note|
==============================================================
|1 |Start Date Required |Flag Flip |Flipped per cust|
|1 |Start Date Required |Date |Start Date and End Date N.A.
|1 |End Date Required |Flag Flip |Flipped per cust
|1 |End Date Required |Date |Start Date and End Date N.A.
|8 |Description Required |Date |Date
|4 |Sink Flag not set |Factor |Factor is N.A
|4 |Sink Flag not set |Factor Update |Factor is N.A.
|4 |Sink Flag not set |Sink |Not Sinkable
我正在尝试创建另一名为"状态"的列。 我可以为每个ID有多个注释,有时它们与错误无关。 这就是为什么您看到对于 ID 1,只有 2 个错误,但有 4 列,因为此 ID 还附加了一个"标志翻转"注释。 对于每个"错误",它将重复附加到ID的每个注释。
我们只关心与错误相关的主题/注释。 如果 ID 相同,并且其中一个注释列与错误列相关,则它可以具有"清除"状态。 如果没有与错误相关的注释,则其状态必须为"审核">
由于这个逻辑,我想要的表格
|ID| |Error| |Subject| |Note| |STATUS|
=======================================================================================
|1 |Start Date Required |Flag Flip |Flipped per cust| |Clear|
|1 |Start Date Required |Date |Start Date and End Date N.A. |Clear|
|1 |End Date Required |Flag Flip |Flipped per cust |Clear|
|1 |End Date Required |Date |Start Date and End Date N.A. |Clear|
|8 |Description Required |Date |Date |Review|
|4 |Sink Flag not set |Factor |Factor is N.A |Clear|
|4 |Sink Flag not set |Factor Update |Factor is N.A. |Clear|
|4 |Sink Flag not set |Sink |Not Sinkable |Clear|
如果上方或下方的行具有相同的 ID,并且 ERROR 列具有与之关联的 NOTE,则清除。如果没有与错误相关的注释(每个 id(,则查看。
例如,由于 ID 1 具有开始日期/结束日期错误,并且注释与开始日期/结束日期为 N.A 有关,因此对于 ID 为 1 的所有 4 行,它的状态可以是 CLEAR
由于 ID 8 具有"需要描述"的错误,但注释与 DATE 有关,因此必须对其进行审查,因为没有关于描述的注释。
由于 ID 4 具有接收器标志错误,并且有一行带有接收器主题/注释,因此它的所有 3 行的状态都可以为 CLEAR
。我不知道如何写这个逻辑。我分别有每一行的逻辑,但我不知道如何让它们按 ID 关联,以便如果具有相同 ID 的一行具有与错误相关的注释,则可以清除具有该 ID 的所有行。 任何帮助将不胜感激!谢谢。
好的,所以我们已经设法到达了一个地方,我们可以在查询中构建一些智能,以便它知道如何处理一些错误。 我们可以从那里构建
下面是基于我们所知道的第一次通过查询:
SELECT
ID,
CASE
WHEN error LIKE '%Date Required' AND Note LIKE '%'||REPLACE(error, ' Required', '%') THEN 'Clear'
WHEN error LIKE '%Sink%' and note LIKE '%sink%' THEN 'Clear'
ELSE 'Review'
END as Status
FROM
table
它会将一些行转换为"清除",但大多数行需要查看。我们不介意这个想法,因为 yu 似乎在说,只要给定 ID 的任何一行都是"清除"的,它们都可以清晰。在这种情况下,我将利用按字母顺序排列的"清除"在"审查"之前的事实,因此,如果我们按 ID 分组并询问 MIN 状态,如果有什么是清除,它们都会得到一个清除:
SELECT
ID,
MIN(CASE
WHEN error LIKE '%Date Required' AND Note LIKE '%'||REPLACE(error, ' Required', '%') THEN 'Clear'
WHEN error LIKE '%Sink%' and note LIKE '%sink%' THEN 'Clear'
ELSE 'Review'
END) as Status
FROM
table
GROUP BY
ID
现在,我们需要做的就是应用此每 id 确定值,使其成为子查询并将其联接回数据:
SELECT * FROM
(
SELECT
ID,
MIN(CASE
WHEN error LIKE '%Date Required' AND Note LIKE '%'||REPLACE(error, ' Required', '%') THEN 'Clear'
WHEN error LIKE '%Sink%' and note LIKE '%sink%' THEN 'Clear'
ELSE 'Review'
END) as Status
FROM
table
GROUP BY
ID
) determine
INNER JOIN
table t
ON
t.ID = determine.ID