Доступ к кросс-таблице Query - PullRequest
0 голосов
/ 03 мая 2018

У меня есть две таблицы.

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 получить доступ к требованиям, которые я поместил product.quantity - SUB2.ORDERED в статистическую функцию. Когда я делаю то, что он говорит, он говорит мне, что product.quantity - SUB2.ORDERED не может быть в статистической функции. Я в растерянности.

EDIT:

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

1 Ответ

0 голосов
/ 03 мая 2018

Ваш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...