Как объединить 5 таблиц MYSQL с определенным условием c - PullRequest
0 голосов
/ 08 мая 2020

у меня есть 5 таблиц ниже

tb_satker

kdsatker
1
2
3

tb_akun

akun | code
A    | 1
B    | 2
C    | 3

tb_simponi

kdsatker | akun | jumlah
1        | A    | 100
1        | B    | 200

tb_span

kdsatker | akun | jumlah
1        | A    | 1
1        | B    | 2
1        | C    | 3

tb_upt

kdsatker | akun | jumlah
1        | A    | 10
1        | B    | 20
1        | C    | 30

Мне нужно вывести что-то вроде этого

kdsatker | akun | simponi | span | upt
1        | A    | 100     | 1    | 10
1        | B    | 200     | 2    | 20
1        | C    | 0       | 3    | 30
2        | 0    | 0       | 0    | 0
3        | 0    | 0       | 0    | 0

Я пробовал использовать sql скрипку, но результат неверный (http://sqlfiddle.com/#! 9 / e83ce7 / 10 )

SELECT tb_satker.kdsatker,tb_akun.akun,tb_simponi2.simponi,tb_span2.span,tb_upt2.upt
FROM tb_satker
LEFT JOIN (SELECT kdsatker,akun,sum(tb_simponi.jumlah) as simponi FROM tb_simponi GROUP BY kdsatker,akun)
as tb_simponi2 ON tb_simponi2.kdsatker=tb_satker.kdsatker
LEFT JOIN (SELECT kdsatker,akun,sum(tb_span.jumlah) as span FROM tb_span GROUP BY kdsatker,akun)
as tb_span2 ON tb_span2.kdsatker=tb_satker.kdsatker
LEFT JOIN (SELECT kdsatker,akun,sum(tb_upt.jumlah) as upt FROM tb_upt GROUP BY kdsatker,akun)
as tb_upt2 ON tb_upt2.kdsatker=tb_satker.kdsatker
LEFT JOIN 
tb_akun ON tb_akun.akun=tb_simponi2.akun AND
tb_akun.akun=tb_span2.akun AND
tb_akun.akun=tb_upt2.akun
GROUP BY tb_satker.kdsatker,tb_akun.akun

Кто-нибудь может мне помочь с правильной идеей ?? Большое спасибо

1 Ответ

1 голос
/ 08 мая 2020

Все ваши внутренние запросы основаны на группе, состоящей из двух частей: kdsatker и akun. Поскольку это возможно для любого из tb_simponi, tb_span, tb_upt может иметь любую комбинацию, я бы предварительно объединил все возможные комбинации этих ПЕРВЫХ. ТОГДА присоединяйтесь к сводным результатам. и НАКОНЕЦ получить компоненты akun и kdsatker. Что-то вроде ...

SELECT 
        tb_satker.kdsatker,
        coalesce( tb_akun.akun, 0 ) akun,
        coalesce( tb_simponi2.simponi, 0 ) simponi,
        coalesce( tb_span2.span, 0 ) span,
        coalesce( tb_upt2.upt, 0 ) upt
    FROM 
        tb_satker
            LEFT JOIN
            ( SELECT distinct kdsatker, akun FROM tb_simponi 
                UNION
                  SELECT kdsatker, akun FROM tb_span 
                UNION
                  SELECT kdsatker, akun FROM tb_upt 
             ) AllKdAkun
                on tb_satker.kdsatker = AllKdAkun.kdsatker

                LEFT JOIN tb_akun
                    on AllKdAkun.akun = tb_akun.akun

                LEFT JOIN 
                (SELECT kdsatker, akun, sum(tb_simponi.jumlah) as simponi 
                    FROM tb_simponi 
                    GROUP BY kdsatker, akun ) as tb_simponi2 
                    ON AllKdAkun.kdsatker = tb_simponi2.kdsatker
                    AND AllKdAkun.Akun = tb_simponi2.akun

                LEFT JOIN 
                (SELECT kdsatker, akun, sum(tb_span.jumlah) as span 
                    FROM tb_span 
                    GROUP BY kdsatker, akun ) as tb_span2 
                    ON AllKdAkun.kdsatker = tb_span2.kdsatker
                    AND AllKdAkun.akun = tb_span2.akun

                LEFT JOIN 
                (SELECT kdsatker, akun, sum(tb_upt.jumlah) as upt 
                    FROM tb_upt 
                    GROUP BY kdsatker, akun) as tb_upt2 
                    ON AllKdAkun.kdsatker = tb_upt2.kdsatker
                    AND AllKdAkun.akun = tb_upt2.akun

Нет последней группы на внешнем уровне.

Первый уровень - ваш tb_satker. Запись может быть (или нет) в любой из вспомогательных таблиц, так что это первая.

Второй уровень - это отдельный список каждого kdsatker, akun в ЛЮБОЙ из трех других таблиц. Итак, теперь вы можете LEFT JOIN kdsatker, таким образом сохраняя каждую запись, включая 1, 2, 3, даже если 2 и 3 не имеют записей.

Со второго уровня вы можете теперь присоединиться к tb_akun таблица, которая в данном случае только kdsatker является единственной с записями для любого данного акуна.

Наконец, присоединение к списку предварительного объединения всех комбинаций, сгруппированных по kdsatker, akun, может быть сопоставлено для их окончательного резюме в окончательный список.

Надеюсь, каждый шаг имеет смысл для того, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...