WHERE CASE 返回多行
WHERE CASE returning multiple rows
我希望此查询 return 只有一行。我已经按照它们最有可能出现的顺序放置了 CASE 语句的 WHEN 子句,所以最有可能的 TRUE 语句将始终首先被评估。但是,似乎每个 WHEN 语句都在查询完成之前被评估,尽管它找到了多个 TRUE 语句。
SELECT To_Char(T.PRFINISH, 'DD/MM/YY') FINISH,
T.PRNAME
FROM PRTASK T
LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID
WHERE T.PRNAME = CASE
WHEN (T.PRNAME = 'Concept Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Concept BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept BRU Meeting Date'
WHEN (T.PRNAME = 'End of Concept Phase' AND T.PRSTATUS != 2) THEN 'End of Concept Phase'
WHEN (T.PRNAME = 'Evaluate Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Evaluate BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate BRU Meeting Date'
WHEN (T.PRNAME = 'Evaluate TSC Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate TSC Meeting Date'
WHEN (T.PRNAME = 'End of Evaluate Phase' AND T.PRSTATUS != 2) THEN 'End of Evaluate Phase'
WHEN (T.PRNAME = 'End of Analyse Phase' AND T.PRSTATUS != 2) THEN 'End of Analyse Phase'
WHEN (T.PRNAME = 'End of Design Phase' AND T.PRSTATUS != 2) THEN 'End of Design Phase'
WHEN (T.PRNAME = 'End of Build Phase' AND T.PRSTATUS != 2) THEN 'End of Build Phase'
WHEN (T.PRNAME = 'End of Test Phase' AND T.PRSTATUS != 2) THEN 'End of Test Phase'
WHEN (T.PRNAME = 'In Service' AND T.PRSTATUS != 2) THEN 'In Service'
WHEN (T.PRNAME = 'End of Implement Phase' AND T.PRSTATUS != 2) THEN 'End of Implement Phase'
WHEN (T.PRNAME = 'End of Closure Phase' AND T.PRSTATUS != 2) THEN 'End of Closure Phase'
ELSE 'In Service'
END
AND INV_INVESTMENTS.CODE = '007058'
这 return 不止一行,即使第一个 WHEN 子句为真。我认为 CASE 语句在找到 TRUE 语句时就结束了。
编辑:也许我没有很好地解释这一点,让我们试试这个:
在INV_INVESTMENTStable中的每个ID都是一个项目。每个项目在 PRTASK table 中都有一组任务。在这个 PRTASK table 中,我们将有任务名称 (PRNAME)、状态 (PRSTATUS) 和完成日期 (PRFINISH)。任务列表,按照它们在项目中出现的顺序是:
1.概念技术 PEP 会议日期
2。概念 BRU 会议日期
3。概念阶段结束
4。评估技术 PEP 会议日期
5。评估 BRU 会议日期
6.评估 TSC 会议日期
其余任务按照我在 CASE 语句中列出的顺序进行。我希望此查询 return 是列表中 PRSTATUS 为 0 或 1 的第一个任务的完成日期。
试试这个。您可以将已知名称放入 table,然后在联接中使用它。这会将您的 select 简化为以下内容:
SELECT TOP 1 To_Char(T.PRFINISH, 'DD/MM/YY') FINISH,
T.PRNAME
FROM PRTASK T
LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID
JOIN (
SELECT 'Concept Tech PEP Meeting Date' as Name, 1 as [Order]
UNION All
SELECT '<your next PRNAME here', 2 as [Order]
UNION ALL ...
) names on names.Name = T.PRNAME
where PRSTATUS IN (0,1) AND PRINV_INVESTMENTS.CODE = '007058'
ORDER BY names.Order
我还是不明白你想做什么(没有给出示例 data/results),但我会像这样重组它:
SELECT To_Char(PRFINISH, 'DD/MM/YY') AS FINISH, PRNAME
FROM (
SELECT MAX(PRFINISH),
PRNAME
FROM PRTASK AS T
WHERE (PRNAME = 'In Service' OR PRSTATUS != 2)
AND PRPROJECTID IN
(SELECT ID
FROM INV_INVESTMENTS
WHERE CODE = '007058' )
GROUP BY PRNAME
) AS TABLE1
请注意,这是假设您在查询中列出了 PRNAME
的所有可能值。
我希望此查询 return 只有一行。我已经按照它们最有可能出现的顺序放置了 CASE 语句的 WHEN 子句,所以最有可能的 TRUE 语句将始终首先被评估。但是,似乎每个 WHEN 语句都在查询完成之前被评估,尽管它找到了多个 TRUE 语句。
SELECT To_Char(T.PRFINISH, 'DD/MM/YY') FINISH,
T.PRNAME
FROM PRTASK T
LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID
WHERE T.PRNAME = CASE
WHEN (T.PRNAME = 'Concept Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Concept BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept BRU Meeting Date'
WHEN (T.PRNAME = 'End of Concept Phase' AND T.PRSTATUS != 2) THEN 'End of Concept Phase'
WHEN (T.PRNAME = 'Evaluate Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Evaluate BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate BRU Meeting Date'
WHEN (T.PRNAME = 'Evaluate TSC Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate TSC Meeting Date'
WHEN (T.PRNAME = 'End of Evaluate Phase' AND T.PRSTATUS != 2) THEN 'End of Evaluate Phase'
WHEN (T.PRNAME = 'End of Analyse Phase' AND T.PRSTATUS != 2) THEN 'End of Analyse Phase'
WHEN (T.PRNAME = 'End of Design Phase' AND T.PRSTATUS != 2) THEN 'End of Design Phase'
WHEN (T.PRNAME = 'End of Build Phase' AND T.PRSTATUS != 2) THEN 'End of Build Phase'
WHEN (T.PRNAME = 'End of Test Phase' AND T.PRSTATUS != 2) THEN 'End of Test Phase'
WHEN (T.PRNAME = 'In Service' AND T.PRSTATUS != 2) THEN 'In Service'
WHEN (T.PRNAME = 'End of Implement Phase' AND T.PRSTATUS != 2) THEN 'End of Implement Phase'
WHEN (T.PRNAME = 'End of Closure Phase' AND T.PRSTATUS != 2) THEN 'End of Closure Phase'
ELSE 'In Service'
END
AND INV_INVESTMENTS.CODE = '007058'
这 return 不止一行,即使第一个 WHEN 子句为真。我认为 CASE 语句在找到 TRUE 语句时就结束了。
编辑:也许我没有很好地解释这一点,让我们试试这个:
在INV_INVESTMENTStable中的每个ID都是一个项目。每个项目在 PRTASK table 中都有一组任务。在这个 PRTASK table 中,我们将有任务名称 (PRNAME)、状态 (PRSTATUS) 和完成日期 (PRFINISH)。任务列表,按照它们在项目中出现的顺序是:
1.概念技术 PEP 会议日期
2。概念 BRU 会议日期
3。概念阶段结束
4。评估技术 PEP 会议日期
5。评估 BRU 会议日期
6.评估 TSC 会议日期
其余任务按照我在 CASE 语句中列出的顺序进行。我希望此查询 return 是列表中 PRSTATUS 为 0 或 1 的第一个任务的完成日期。
试试这个。您可以将已知名称放入 table,然后在联接中使用它。这会将您的 select 简化为以下内容:
SELECT TOP 1 To_Char(T.PRFINISH, 'DD/MM/YY') FINISH,
T.PRNAME
FROM PRTASK T
LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID
JOIN (
SELECT 'Concept Tech PEP Meeting Date' as Name, 1 as [Order]
UNION All
SELECT '<your next PRNAME here', 2 as [Order]
UNION ALL ...
) names on names.Name = T.PRNAME
where PRSTATUS IN (0,1) AND PRINV_INVESTMENTS.CODE = '007058'
ORDER BY names.Order
我还是不明白你想做什么(没有给出示例 data/results),但我会像这样重组它:
SELECT To_Char(PRFINISH, 'DD/MM/YY') AS FINISH, PRNAME
FROM (
SELECT MAX(PRFINISH),
PRNAME
FROM PRTASK AS T
WHERE (PRNAME = 'In Service' OR PRSTATUS != 2)
AND PRPROJECTID IN
(SELECT ID
FROM INV_INVESTMENTS
WHERE CODE = '007058' )
GROUP BY PRNAME
) AS TABLE1
请注意,这是假设您在查询中列出了 PRNAME
的所有可能值。