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 等...)并将相似的数据字段保持在相同的上下文中。