UNION ALL 和空值/错误
UNION ALL and Nulls / Error
我正在处理 UNION ALL 并在开始时收到此错误:
消息 205,级别 16,状态 1,第 1 行
使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询在其目标列表中必须具有相同数量的表达式。
我认为这是错误发生的地方:
With CTE AS(
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN, Part3, Part3_PN, Part3_SN from testtest
)
我认为我需要在第一个 SELECT 语句中插入更多字段。我已经用下面的工作更正了它,但是当我这样做时,我没有从第 3 部分、第 4 部分收到我需要的一些信息,我怀疑我需要输入其他 15 个部分。当我查找 AGH(不在第 1 部分或第 2 部分中,但在第 3 部分中)时,我只收到 NULL 信息。所以 AGH,AGH_PN,AGH_SN 都是 NULL,当我期望其中有一些信息时。
With CTE AS(
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN, NULL t1, NULL t2, NULL t3, NULL t4, NULL t5, NULL t6 FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN, Part3, Part3_PN, Part3_SN, Part4, Part4_PN, Part4_SN from testtest
)
Select Pull_Date, Well_Name,
MIN(CASE WHEN Part='BODH' THEN 'BODH' ELSE NULL END) [BODH],
MIN(CASE WHEN Part='BODH' THEN PartPN Else NULL END) BODH_PN,
MIN(CASE WHEN Part='BODH' THEN PartSN ELSE NULL END) BODH_SN,
MIN(CASE WHEN Part='Cable' THEN 'Cable' ELSE NULL END) [Cable],
MIN(CASE WHEN Part= 'Cable' THEN PartPN Else NULL END) Cable_PN,
MIN(CASE WHEN Part= 'Cable' THEN PartSN ELSE NULL END) Cable_SN,
MIN(CASE WHEN Part= 'Pump' THEN 'Pump' ELSE Null END) [Pump],
MIN(CASE WHEN Part= 'Pump' THEN PartPN ELSE NULL END) Pump_PN,
MIN(CASE WHEN Part= 'Pump' THEN PartSN ELSE NULL END) Pump_SN,
MIN(CASE WHEN Part= 'MLE' THEN 'MLE' ELSE NULL END) [MLE],
MIN(CASE WHEN Part= 'MLE' THEN PartPN ELSE NULL END) MLE_PN,
MIN(CASE WHEN Part= 'MLE' THEN PartSN ELSE NULL END) MLE_SN,
MIN(CASE WHEN Part= 'AGH' THEN 'AGH' ELSE NULL END) [AGH],
MIN(CASE WHEN Part= 'AGH' THEN PartPN ELSE NULL END) AGH_PN,
MIN(CASE WHEN Part= 'AGH' THEN PartSN ELSE NULL END) AGH_SN
FROM CTE
GROUP BY Pull_Date, Well_Name
如有任何帮助,我们将不胜感激。
你是对的,错误在你突出显示的查询中。错误消息告诉您,您从 UNION ALL 任一侧的查询中 return 的字段数应该相同,否则它不知道如何将它们组合成一个结果集
-- This SELECT statement has five columns. The last three are aliased.
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN FROM testtest
UNION ALL
-- This SELECT statement has eight columns. Hence the error.
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN, Part3, Part3_PN, Part3_SN from testtest
因此,要么第一个 SELECT 中需要逗号,因为别名实际上是列名,没有逗号是错字,或者您需要注意第二个 SELECT 以便它与首先,或者如果第二个 SELECT 是正确的并且有八列,那么第一个 SELECT 需要包括 'placeholder' 列,如 ,NULL 作为部分,以便两个 SELECTs有八列。
据我所知,为什么要在第二个查询中添加 Part3?我想你想要更像这样的东西:
With CTE AS
(
SELECT Pull_Date, Well_Name, Part1 AS Part, Part1_PN AS PartPN, Part1_SN AS PartSN FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part3, Part3_PN, Part3_SN FROM testtest
)
此设置是否可能比您的问题所揭示的更多?你的 table 长什么样?
您说您的问题是 AGH 总是返回空值并填充在 "Part3" 字段中。如果是这种情况,您需要像对第 1 部分和第 2 部分所做的那样为 "Part3" 字段提取数据。
像这样从多个字段聚合数据时,您需要确保每个实例都有自己的记录。像处理第 2 部分和第 1 部分那样分解第 3 部分...允许您摆脱额外的字段(NULL t1、NULL t2 等...)并将相似的数据字段保持在相同的上下文中。
我正在处理 UNION ALL 并在开始时收到此错误:
消息 205,级别 16,状态 1,第 1 行 使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询在其目标列表中必须具有相同数量的表达式。
我认为这是错误发生的地方:
With CTE AS(
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN, Part3, Part3_PN, Part3_SN from testtest
)
我认为我需要在第一个 SELECT 语句中插入更多字段。我已经用下面的工作更正了它,但是当我这样做时,我没有从第 3 部分、第 4 部分收到我需要的一些信息,我怀疑我需要输入其他 15 个部分。当我查找 AGH(不在第 1 部分或第 2 部分中,但在第 3 部分中)时,我只收到 NULL 信息。所以 AGH,AGH_PN,AGH_SN 都是 NULL,当我期望其中有一些信息时。
With CTE AS(
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN, NULL t1, NULL t2, NULL t3, NULL t4, NULL t5, NULL t6 FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN, Part3, Part3_PN, Part3_SN, Part4, Part4_PN, Part4_SN from testtest
)
Select Pull_Date, Well_Name,
MIN(CASE WHEN Part='BODH' THEN 'BODH' ELSE NULL END) [BODH],
MIN(CASE WHEN Part='BODH' THEN PartPN Else NULL END) BODH_PN,
MIN(CASE WHEN Part='BODH' THEN PartSN ELSE NULL END) BODH_SN,
MIN(CASE WHEN Part='Cable' THEN 'Cable' ELSE NULL END) [Cable],
MIN(CASE WHEN Part= 'Cable' THEN PartPN Else NULL END) Cable_PN,
MIN(CASE WHEN Part= 'Cable' THEN PartSN ELSE NULL END) Cable_SN,
MIN(CASE WHEN Part= 'Pump' THEN 'Pump' ELSE Null END) [Pump],
MIN(CASE WHEN Part= 'Pump' THEN PartPN ELSE NULL END) Pump_PN,
MIN(CASE WHEN Part= 'Pump' THEN PartSN ELSE NULL END) Pump_SN,
MIN(CASE WHEN Part= 'MLE' THEN 'MLE' ELSE NULL END) [MLE],
MIN(CASE WHEN Part= 'MLE' THEN PartPN ELSE NULL END) MLE_PN,
MIN(CASE WHEN Part= 'MLE' THEN PartSN ELSE NULL END) MLE_SN,
MIN(CASE WHEN Part= 'AGH' THEN 'AGH' ELSE NULL END) [AGH],
MIN(CASE WHEN Part= 'AGH' THEN PartPN ELSE NULL END) AGH_PN,
MIN(CASE WHEN Part= 'AGH' THEN PartSN ELSE NULL END) AGH_SN
FROM CTE
GROUP BY Pull_Date, Well_Name
如有任何帮助,我们将不胜感激。
你是对的,错误在你突出显示的查询中。错误消息告诉您,您从 UNION ALL 任一侧的查询中 return 的字段数应该相同,否则它不知道如何将它们组合成一个结果集
-- This SELECT statement has five columns. The last three are aliased.
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN FROM testtest
UNION ALL
-- This SELECT statement has eight columns. Hence the error.
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN, Part3, Part3_PN, Part3_SN from testtest
据我所知,为什么要在第二个查询中添加 Part3?我想你想要更像这样的东西:
With CTE AS
(
SELECT Pull_Date, Well_Name, Part1 AS Part, Part1_PN AS PartPN, Part1_SN AS PartSN FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part3, Part3_PN, Part3_SN FROM testtest
)
此设置是否可能比您的问题所揭示的更多?你的 table 长什么样?
您说您的问题是 AGH 总是返回空值并填充在 "Part3" 字段中。如果是这种情况,您需要像对第 1 部分和第 2 部分所做的那样为 "Part3" 字段提取数据。
像这样从多个字段聚合数据时,您需要确保每个实例都有自己的记录。像处理第 2 部分和第 1 部分那样分解第 3 部分...允许您摆脱额外的字段(NULL t1、NULL t2 等...)并将相似的数据字段保持在相同的上下文中。