我在Access中有以下UNION ALL查询。这些表都是链接的ODBC表,我希望生成一个显示以下内容的表:
js/jquery
库存代码和现有库存似乎正确填充。我的订单数量有问题。在运行查询时,Access会不断提示输入“ SumOfQTYORDERED”参数。
知道我要去哪里哪里吗?
答案 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;
这将为每个项目返回一行。