Как объединить все и сгруппировать множественным выбором без нулевого вывода? - PullRequest
0 голосов
/ 22 апреля 2019

У меня проблемы при выборе по объединению и по группам, на выходе есть нулевой вывод. Может быть, потому что есть несколько входов с подробными данными и некоторые математические операции внутри. У меня есть 1 таблица представления с первичным ключом и 2 внешних ключа, которые связаны с 2 таблицами.

Я пробовал этот код, объединяя все и группируя изнутри.

SELECT no_daftar,nama,(k1/jk1) as k1,(k2/jk2) as k2,(k3/jk3) as k3,(k4/jk4) as k4  FROM
(
SELECT no_daftar, nama,  SUM(k1) as k1,  SUM(k2)  as k2, SUM(k3) as k3, SUM(k4) as k4,
(SELECT COUNT(kode_aspek) FROM kriteria WHERE kode_aspek="K1" AND kode_aspek=a.kode_aspek) as jk1,
(SELECT COUNT(kode_aspek) FROM kriteria WHERE kode_aspek="K2" AND kode_aspek=a.kode_aspek) as jk2,
(SELECT COUNT(kode_aspek) FROM kriteria WHERE kode_aspek="K3" AND kode_aspek=a.kode_aspek) as jk3,
(SELECT COUNT(kode_aspek) FROM kriteria WHERE kode_aspek="K4" AND kode_aspek=a.kode_aspek) as jk4
    FROM 
(
SELECT no_daftar, nama, kode_aspek, nilai AS k1, 0 AS k2, 0 as k3, 0 as k4 FROM bobot WHERE kode_aspek =  'K1' AND tahun = 2019
UNION ALL
SELECT no_daftar, nama, kode_aspek, 0 AS k1, nilai AS k2, 0 as k3, 0 as k4 FROM bobot WHERE kode_aspek =  'K2' AND tahun = 2019
UNION ALL
SELECT no_daftar, nama, kode_aspek, 0 AS k1, 0 AS k2, nilai as k3, 0 as k4 FROM bobot WHERE kode_aspek =  'K3' AND tahun = 2019
UNION ALL
SELECT no_daftar, nama, kode_aspek, 0 AS k1, 0 AS k2, 0 as k3, nilai as k4 FROM bobot WHERE kode_aspek =  'K4' AND tahun = 2019
) AS a
LEFT JOIN aspek b ON ( a.kode_aspek = b.kode_aspek )
GROUP BY a.no_daftar, a.kode_aspek
) as SEMI

Ссылка для скачивания базы данных здесь: https://drive.google.com/file/d/1a5BNT34v3keKwFaPxV73C48NzKQho34O/view?usp=sharing

Я ожидаю, что выходные данные будут у каждого 1 первичного ключа иметь 4 выходных в каждой строке, но фактический результат - 4 строки с нулевым выражением

1 Ответ

0 голосов
/ 22 апреля 2019

Не уверен, что это даст ожидаемые результаты.Но вместо использования UNION вы можете попытаться с помощью условного агрегирования повернуть буквы K.

Например, этот непроверенный набросок блокнота.

SELECT 
 bb.no_daftar, 
 bb.nama, 
 SUM(CASE WHEN bb.kode_aspek = 'K1' THEN bb.total_nilai/kr.cnt ELSE 0 END) AS k1,
 SUM(CASE WHEN bb.kode_aspek = 'K2' THEN bb.total_nilai/kr.cnt ELSE 0 END) AS k2,
 SUM(CASE WHEN bb.kode_aspek = 'K3' THEN bb.total_nilai/kr.cnt ELSE 0 END) AS k3,
 SUM(CASE WHEN bb.kode_aspek = 'K4' THEN bb.total_nilai/kr.cnt ELSE 0 END) AS k4
FROM
(
SELECT 
     no_daftar, kode_aspek,
     MAX(nama) AS nama,
     SUM(nilai) AS total_nilai
    FROM bobot
    WHERE tahun = 2019
      AND kode_aspek IN ('K1','K2','K3','K4')
    GROUP BY no_daftar, kode_aspek
) bb
LEFT JOIN
(
    SELECT kode_aspek, COUNT(*) AS cnt
    FROM kriteria
    WHERE kode_aspek IN('K1','K2','K3','K4')
    GROUP BY kode_aspek
) kr ON kr.kode_aspek = bb.kode_aspek
GROUP BY bb.no_daftar, bb.nama
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...