sql - Access 交叉表查询

标签 sql ms-access

我有两个表。

enter image description here

我需要从当前数量中减去订购的商品数量 记录。

我可以像这样得到每个单独项目的销售额的 count():

SELECT SALES.PRODUCT_ID AS ORDERED_ID
         ,COUNT(SALES.PRODUCT_ID) AS ORDERED
   FROM SALES
   GROUP BY SALES.PRODUCT_ID

这给了我:

ORDERED_ID  ORDERED
1201    2
1202    2
1204    2
1205    3
1206    1
1207    2
1208    1
1209    1
1210    3

获取数量只是一个问题

SELECT PRODUCT.PRODUCT_ID AS INVEN_ID
         ,PRODUCT.QUANTITY AS INVEN
    FROM PRODUCT

这给了我:

INVEN_ID    INVEN
1199    5
1200    2
1201    33
1202    44
1203    55
1204    66
1205    77
1206    88
1207    99
1208    110
1209    121
1210    132

我在这个问题上花了几个小时,但放弃了我认为应该是解决方案的方法:

SELECT SUB1.INVEN - SUB2.ORDERED
FROM 
 (SELECT PRODUCT.PRODUCT_ID AS INVEN_ID
         ,PRODUCT.QUANTITY AS INVEN
    FROM PRODUCT
 )AS SUB1
,(SELECT SALES.PRODUCT_ID AS ORDERED_ID
         ,COUNT(SALES.PRODUCT_ID) AS ORDERED
   FROM SALES
   GROUP BY SALES.PRODUCT_ID
  )AS SUB2
  INNER JOIN SUB1 ON SUB1.INVEN_ID = SUB2.ORDERED_ID

但是,access 不会将最后一个连接识别为有效连接,如果没有它,我只会得到笛卡尔积。如果我尝试在没有子查询的情况下检索 quantity 并且只是尝试 SELECT product.quantity - SUB2.ORDERED Access 请求,我将 product.quantity - SUB2。 ORDERED 在聚合函数中。当我按照它说的去做时,它会告诉我 product.quantity - SUB2.ORDERED 不能在聚合函数中。我很茫然。

编辑:

Final Solution:

SELECT SUB1.INVEN_ID AS PRODUCT_ID
       ,SUB1.PRODUCT_NAME AS PRODUCT_NAME
       ,SUB1.PRICE AS PRICE
       ,SUB1.INVEN - NZ(SUB2.ORDERED,0) AS AVAILABLE
FROM 
 (SELECT PRODUCT.PRODUCT_ID AS INVEN_ID
         ,PRODUCT.PRODUCT_NAME AS PRODUCT_NAME
         ,PRODUCT.PRICE AS PRICE
         ,PRODUCT.QUANTITY AS INVEN
    FROM PRODUCT
 )AS SUB1 
 LEFT  JOIN
(SELECT SALES.PRODUCT_ID AS ORDERED_ID
         ,COUNT(SALES.PRODUCT_ID) AS ORDERED
   FROM SALES
   GROUP BY SALES.PRODUCT_ID
  )AS SUB2 ON SUB1.INVEN_ID = SUB2.ORDERED_ID

最佳答案

您的 INNER JOIN 应该放在第一个子查询之后。

我认为您正在寻找 LEFT JOIN,因为 PRODUCT 表应该是主表。

如果你使用 LEFT JOIN SUB2.ORDERED 列可能是 NULL 所以使用 NZ 函数 或 IIF(ISNULL(SUB2.ORDERED),0,SUB2.ORDERED) 进行检查。

你可以试试这个。

SELECT SUB1.INVEN - NZ(SUB2.ORDERED,0)
FROM 
(SELECT PRODUCT.PRODUCT_ID AS INVEN_ID
         ,PRODUCT.QUANTITY AS INVEN
    FROM PRODUCT
)AS SUB1
LEFT JOIN
(SELECT SALES.PRODUCT_ID AS ORDERED_ID
         ,COUNT(SALES.PRODUCT_ID) AS ORDERED
   FROM SALES
   GROUP BY SALES.PRODUCT_ID
)AS SUB2 ON SUB1.INVEN_ID = SUB2.ORDERED_ID

关于sql - Access 交叉表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50149144/

相关文章:

sql - MySQL 中的更新问题

sql - 导轨 3 : ActiveRecord query with :includes only returns results that have related values in included table?

ms-access - 在 MS Access 中按名称打开 DBF 文件

ms-access - Access 错误 2427 : You entered an expression that has no value

SQL 子查询与连接混淆

java - UCanAccess 分组依据

mysql - 如何将此 ER 图转换为关系模式

mysql - SQL GROUP BY "HAVING"需要的行

sql - 使用转换时缺少时间部分

vba - Access 2010 编译报错User-defined type not defined