Подсчет всех записей из inner-join - PullRequest
1 голос
/ 13 мая 2019

У меня есть 4 таблицы с aantal (count), и каждая таблица показывает нормальные числа или числа с - до (пример: -20), теперь мне нужно сосчитать все эти записи.но я не знаю, как я могу это исправить.

Извините, я нуб в sql.

это мой код

Проблема, с которой я сталкиваюсьэто тх все записи из разных таблиц, которые имеют столбец aantal не считая в общей сложности

пример:. CSSDKMagento_10_Plankvoorraad возвращает 10 CSSDKMagento_20_GeenAllocatieWelFiat возвращает -3 и -2 CSSDKMagento_30_AllocatieVoorraad возвращает 5 возвращает CSSDKMagento_50_AllocatieBestellingBinnen -1 и -1

Это означает, что я получаю по возвращении из Voorraad 8.

Я пытался count(*), но это не решение.с лучшим способом я могу это сделать?

SELECT 
    i.ItemCode, 
    g.warehouse,
    SUM(g.aantal) AS Voorraad,
    MAX(CASE 
        WHEN g.transtype = 'N' THEN g.sysmodified 
        ELSE NULL 
    END) AS LastDate
FROM    dbo.CSSDKMagento_10_Plankvoorraad AS g 
    INNER JOIN  dbo.Items AS i
        ON (g.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_20_GeenAllocatieWelFiat AS a 
        ON (a.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_30_AllocatieVoorraad AS v 
        ON (v.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_50_AllocatieBestellingBinnen AS b 
        ON (b.artcode = i.ItemCode)
WHERE 
       i.itemcode = 'TEST' 
GROUP  BY i.itemcode, 
          g.warehouse;

Ответы [ 3 ]

0 голосов
/ 13 мая 2019

Попробуйте это

SELECT 
    i.ItemCode, 
    g.warehouse,
    SUM(g.aantal)+SUM(a.aantal)+SUM(v.aantal)+SUM(b.aantal) AS Voorraad,
    MAX(CASE 
        WHEN g.transtype = 'N' THEN g.sysmodified 
        ELSE NULL 
    END) AS LastDate
FROM    dbo.CSSDKMagento_10_Plankvoorraad AS g 
    INNER JOIN  dbo.Items AS i
        ON (g.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_20_GeenAllocatieWelFiat AS a 
        ON (a.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_30_AllocatieVoorraad AS v 
        ON (v.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_50_AllocatieBestellingBinnen AS b 
        ON (b.artcode = i.ItemCode)
WHERE 
       i.itemcode = 'TEST' 
GROUP  BY i.itemcode, 
          g.warehouse;
0 голосов
/ 13 мая 2019

Похоже, будет работать следующее:

  WITH itemCodesScope AS
  (
    SELECT 'TEST' as target_ItemCode
  ),
  aggregated_CSSDKMagento_10_Plankvoorraad AS 
  (
    SELECT g.artcode, 
           g.warehouse,
           COUNT(g.aantal) as count_aantal,
           SUM(g.aantal) as sum_aantal,
           MAX(CASE 
              WHEN g.transtype = 'N' THEN g.sysmodified 
              ELSE NULL 
           END) AS LastDate
    FROM dbo.CSSDKMagento_10_Plankvoorraad AS g
        JOIN itemCodesScope ON itemCodesScope.target_itemCode = g.artcode
    GROUP BY
           g.artcode, 
           g.warehouse
  ),
  aggregated_CSSDKMagento_20_GeenAllocatieWelFiat AS 
  (
    SELECT a.artcode ,
           COUNT(a.aantal) as count_aantal,
           SUM(a.aantal) as sum_aantal
    FROM dbo.CSSDKMagento_20_GeenAllocatieWelFiat AS a
        JOIN itemCodesScope ON itemCodesScope.target_itemCode = a.artcode
    GROUP BY
           a.artcode
  ),
  aggregated_CSSDKMagento_30_AllocatieVoorraad AS 
  (
    SELECT v.artcode ,
           COUNT(v.aantal) as count_aantal,
           SUM(v.aantal) as sum_aantal
    FROM dbo.CSSDKMagento_30_AllocatieVoorraad AS v
        JOIN itemCodesScope ON itemCodesScope.target_itemCode = v.artcode
    GROUP BY
           v.artcode
  ),
  aggregated_CSSDKMagento_50_AllocatieBestellingBinnen AS 
  (
    SELECT b.artcode ,
           COUNT(b.aantal) as count_aantal,
           SUM(b.aantal) as sum_aantal
    FROM dbo.CSSDKMagento_50_AllocatieBestellingBinnen AS b
        JOIN itemCodesScope ON itemCodesScope.target_itemCode = b.artcode
    GROUP BY
           b.artcode
  )
  SELECT 
    g.artcode as ItemCode, 
    g.warehouse,
    g.sum_aantal AS Voorraad,
    g.LastDate AS LastDate,
    g.sum_aantal + ISNULL(a.sum_aantal, 0) + ISNULL(v.sum_aantal, 0) + ISNULL(b.sum_aantal, 0) as sum_aantal,
    g.count_aantal + ISNULL(a.count_aantal, 0) + ISNULL(v.count_aantal, 0) + ISNULL(b.count_aantal, 0) as count_aantal
  FROM    aggregated_CSSDKMagento_10_Plankvoorraad AS g 
    INNER JOIN  dbo.Items AS i
        ON (g.artcode = i.ItemCode)
    INNER JOIN itemCodesScope 
        ON itemCodesScope.target_itemCode = i.ItemCode
    LEFT JOIN aggregated_CSSDKMagento_20_GeenAllocatieWelFiat AS a 
        ON (a.artcode = i.ItemCode)
    LEFT JOIN aggregated_CSSDKMagento_30_AllocatieVoorraad AS v 
        ON (v.artcode = i.ItemCode)
    LEFT JOIN aggregated_CSSDKMagento_50_AllocatieBestellingBinnen AS b 
        ON (b.artcode = i.ItemCode)

Объяснение

SQL-объединения производят декартовых произведений , что, скорее всего, привело к неожиданным результатам в исходном запросе. Здесь есть 4 таблицы «количество», которые соединяются через соединения с условиями «ВКЛ (b.artcode = i.ItemCode)», поэтому, если там есть какая-либо таблица, содержащая несколько записей, на выход условия будет входить несколько записей на элемент кода объекта.

Допустим, в a-таблице имеется 9 записей с a.artcode на один i.ItemCode, поэтому существует отношение один ко многим. И скажем, есть 1 запись в b-таблице на один i.ItemCode. Выходные данные Join будут иметь 9 записей a.aantal, но также 9 повторных записей b.aantal. Учитывая наличие агрегации (group by), это повлияет на то, что SUM (b.aantal) в этом запросе Joins будет производить в 9 раз больше, чем sum (b.aantal) в автономном запросе только для b-таблицы.

Декартово произведение можно было бы увидеть легче, если выполнить начальный запрос без агрегирования:

SELECT *
FROM    dbo.CSSDKMagento_10_Plankvoorraad AS g 
    INNER JOIN  dbo.Items AS i
        ON (g.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_20_GeenAllocatieWelFiat AS a 
        ON (a.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_30_AllocatieVoorraad AS v 
        ON (v.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_50_AllocatieBestellingBinnen AS b 
        ON (b.artcode = i.ItemCode)
WHERE 
       i.itemcode = 'TEST'

Приспособление было: группировать по группам перед объединением. Наиболее удобный способ для этого imho - CTE . С помощью CTE я создал 4 временных таблицы с агрегатами для каждого ItemCode, поэтому временные таблицы являются однозначными для ItemCode. Затем при соединении один-к-одному создается только одна выходная строка для каждого ItemCode.

0 голосов
/ 13 мая 2019

Отредактировано:

SELECT SUM(Voorraad) FROM (
SELECT 
    i.ItemCode, 
    g.warehouse,
    g.aantal AS Voorraad,
    MAX(CASE 
        WHEN g.transtype = 'N' THEN g.sysmodified 
        ELSE NULL 
    END) AS LastDate
FROM    dbo.CSSDKMagento_10_Plankvoorraad AS g 
    INNER JOIN  dbo.Items AS i
        ON (g.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_20_GeenAllocatieWelFiat AS a 
        ON (a.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_30_AllocatieVoorraad AS v 
        ON (v.artcode = i.ItemCode)
    INNER JOIN dbo.CSSDKMagento_50_AllocatieBestellingBinnen AS b 
        ON (b.artcode = i.ItemCode)
WHERE 
       i.itemcode = 'TEST' enter code here
GROUP  BY i.itemcode, 
          g.warehouse
)src 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...