如何在2个差异表之间进行合并

时间:2019-11-15 11:07:09

标签: sql ms-access union

我在Access中有以下UNION ALL查询。这些表都是链接的ODBC表,我希望生成一个显示以下内容的表:

js/jquery

库存代码和现有库存似乎正确填充。我的订单数量有问题。在运行查询时,Access会不断提示输入“ SumOfQTYORDERED”参数。

知道我要去哪里哪里吗?

4 个答案:

答案 0 :(得分:1)

真的很简单。
UNION或UNION ALL在每个联合选择中期望相同的列数。
具有相同的类型。

因此,如果最终结果中需要2个值,则每个选择中也需要2个值。
如果联合查询不包含该列,则替换它。

简化示例:

select col1, col2, col3
from
(
  select x as col1, 0 as col2, sum(y) as col3
  from table1
  group by x

  union all

  select a, sum(b), 0
  from table2
  group by a
) q;

请注意,只有第一个选择的列别名对外部查询很重要。

答案 1 :(得分:1)

设置操作的第一个“选择”确定结果列的名称。因此,外部Select中既没有dbo_ICITEM.FMTITEMNO也没有SumOfQTYORDERED列。

您可以添加一个空的NULL列,以使每个Select获得三列,然后像这样将它们聚合

SELECT  FMTITEMNO, Sum(SumOfQUANTITY), Sum(SumOfQTYORDERED)
FROM  
 (
    SELECT  dbo_ICITEM.FMTITEMNO, Sum(dbo_ICIVAL.QUANTITY) AS SumOfQUANTITY,
       -- might need a cast to match the datatype of the 2nd Select
       NULL AS SumOfQTYORDERED
    FROM    dbo_ICIVAL 
    LEFT JOIN dbo_ICITEM -- this might return NULLs for dbo_ICITEM.FMTITEMNO?
                         -- do you need the join to dbo_ICITEM at all?
        ON dbo_ICIVAL.ITEMNO = dbo_ICITEM.ITEMNO
    WHERE   (dbo_ICIVAL.LOCATION='1002')
    GROUP BY dbo_ICITEM.FMTITEMNO
    HAVING  Sum(dbo_ICIVAL.QUANTITY)<>0

    UNION ALL

    SELECT  dbo_OEORDD.ITEM, NULL AS SumOfQUANTITY, Sum(dbo_OEORDD.QTYORDERED) AS SumOfQTYORDERED
    FROM    dbo_OEORDD
    WHERE   (((dbo_OEORDD.LOCATION) IN ('1002')) 
        AND ((dbo_OEORDD.COMPLETE)=0))
    GROUP BY dbo_OEORDD.ITEM
    HAVING  Sum(dbo_OEORDD.QTYORDERED) <> 0

 ) dt
GROUP BY FMTITEMNO 
;

答案 2 :(得分:0)

您的第一个查询包含3列,要合并的第二个查询包含2列。因此,联合查询是错误的。减少列数或增加列数,因为这是应用并集/联合的基本规则,即所有列数及其类型应与要合并的查询相同

答案 3 :(得分:0)

我认为您需要修复union all 并添加一个外部group by

SELECT FMTITEMNO,
       SUM(SumOfQUANTITY),
       SUM(SumOfQTYORDERED)
FROM ((SELECT i.FMTITEMNO, Sum(v.QUANTITY) AS SumOfQUANTITY,
              0 as SumOfQTYORDERED
       FROM dbo_ICIVAL as v LEFT JOIN
            dbo_ICITEM as i
            ON v.ITEMNO = i.ITEMNO
       WHERE v.LOCATION = '1002'
       GROUP BY i.FMTITEMNO
       HAVING Sum(v.QUANTITY) <> 0
      ) UNION ALL
      (SELECT o.ITEM, 0, Sum(o.QTYORDERED) AS SumOfQTYORDERED
       FROM dbo_OEORDD as o
       WHERE o.LOCATION) In ('1002') AND
             o.COMPLETE = 0
       GROUP BY o.ITEM
       HAVING Sum(o.QTYORDERED) <> 0
      )
     ) as x
GROUP BY ITEM;

这将为每个项目返回一行。