Jak połączyć trzy zapytania w jedno?

0

Witam, pomoże ktoś połączyć trzy poniższe zapytania ? Mają wspólne dane w kolumnach LOGIN, NAZWISKO, RODZAJ. Chodzi o połączenie ich w taki sposób, aby po LOGIN, NAZWISKO, RODZAJ jako kolejne kolumny dodać IL_1, IL_2, IL_3 i IL_4

SELECT 
       SUPDN.CODPRP AS LOGIN,
       UTI.NOMPRP AS NAZWISKO,
       VTLP.CIRPIC AS RODZAJ,
       SUM(CASE WHEN VTLE.TYPVTL = 3 THEN 1
                ELSE NULL
       END) AS IL_1,
       SUM(CASE WHEN VTLE.TYPVTL = 2 THEN SUPDN.UVCLIV / SUPDN.PCBPRO
                ELSE NULL
       END) AS IL_2
FROM BIBLIOTEKA.GEVTLP AS VTLP LEFT JOIN BIBLIOTEKA.GEVTLE AS VTLE ON VTLP.NUMVTL = VTLE.NUMVTL,
     BIBLIOTEKA.GESUPDN AS SUPDN LEFT JOIN BIBLIOTEKA.GEZPRP AS UTI  ON SUPDN.CODPRP = UTI.CODPRP
WHERE SUPDN.DATPRB2 BETWEEN ? AND ?
GROUP BY SUPDN.CODPRP, UTI.NOMPRP, VTLP.CIRPIC, VTLE.TYPVTL

SELECT 
DBSE.MAJUTI AS LOGIN,
UTI.NOMPRP AS NAZWISKO,
DBSE.CIRPIC AS RODZAJ,
SUM(DBSE.CUMUOT1) AS IL_3
FROM BIBLIOTEKA.GEDBSE AS DBSE LEFT JOIN BIBLIOTEKA.GEZPRP AS UTI  ON DBSE.MAJUTI = UTI.CODPRP
WHERE DBSE.MAJDAT BETWEEN ? AND ?
GROUP BY DBSE.MAJUTI, UTI.NOMPRP, DBSE.CIRPIC[
SELECT 
JNL.CODUTI AS LOGIN,
UTI.NOMPRP AS NAZWISKO,
case 
when  JNL.CODACT = '850' then '720'
when  JNL.CODACT = '860' then '710'
when  JNL.CODACT = '870' then '810'
else ' ' end AS RODZAJ,
SUM(JNL.SNUPAL) AS IL_4
FROM BIBLIOTEKA.GEJNL AS JNL LEFT JOIN BIBLIOTEKA.GEZPRP AS UTI  ON JNL.CODUTI = UTI.CODPRP
WHERE JNL.DATMVT BETWEEN ? AND ?
GROUP BY JNL.CODUTI, UTI.NOMPRP, JNL.CODACT

Tabele zawierają takie dane:

LOGIN	NAZWISKO	RODZAJ	IL_1	IL_2
LOGDKOV	KOWALSKI1	720	0	491
LOGSPRO	KOWALSKI2	720	0	507
LOGMSA2	KOWALSKI3	720	0	581
LOGSKU2	KOWALSKI4	720	0	446
LOGMKIN	KOWALSKI5	720	0	536
LOGIN	NAZWISKO	RODZAJ	IL_3
LOGMSA2	KOWALSKI3	720	5
LOGSKU2	KOWALSKI4	720	14
LOGIKU2	IKSINSKI3	720	23
LOGJBER	IKSINSKI4	720	2
LOGDKOV	KOWALSKI1	720	5
LOGIN	NAZWISKO	RODZAJ	IL_3
LOGMSA2	KOWALSKI3	720	5
LOGSKU2	KOWALSKI4	720	14
LOGIKU2	IKSINSKI3	720	23
LOGJBER	IKSINSKI4	720	2
LOGDKOV	KOWALSKI1	720	5
LOGIN	NAZWISKO	RODZAJ	IL_4
LOGDMIS	KOWAL1	        720	9
LOGMDUD	KOWAL2	        720	10
LOGMSZP	KOWAL3	        720	10
LOGIKU2	IKSINSKI3	810	7
LOGIKU2	IKSINSKI3	720	84
2

spróbuj w ten deseń:

select  T1.LOGIN
		, T1.NAZWISKO
		, T1.RODZAJ
		, T1.IL_1
		, T1.IL_2
		, T2.IL_3
		, T3.IL_4
FROM
(pierwsze zapytanie) T1
left join (drugie zapytanie) T2 on T1.LOGIN = T2.LOGIN and T1.NAZWISKO = T2.NAZWISKO and T1.RODZAJ = T2.RODZAJ
left join (trzecie zapytanie) T2 on T2.LOGIN = T3.LOGIN and T2.NAZWISKO = T3.NAZWISKO and T2.RODZAJ = T3.RODZAJ

ps. w twoim przykładzie w ostatnim bloku danych popra1 z IL3 na IL4

1

Możesz to zrobić tak:

WITH 
  first_query AS (
    SELECT 
      SUPDN.CODPRP AS LOGIN,
      ...
  _),
  second_query AS (
    SELECT 
      DBSE.MAJUTI AS LOGIN,
      ...
  ),
  third_query AS (
    SELECT 
    JNL.CODUTI AS LOGIN,
    ...
  )
SELECT login, nazwisko, rodzaj, first_query.field, second_query.field, third_query.field
JOIN second_query
  ON first_query.login = second_query.login
 AND first_query.nazwisko = second_query.nazwisko
 AND first_query.rodzaj = second_query.rodzaj
JOIN third_query
  ON first_query.login = third_query.login
 AND first_query.nazwisko = third_query.nazwisko
 AND first_query.rodzaj = third_query.rodzaj;
2

W joiny bym się nie bawił, bo nie wszystkie występują w we wszystkich wynikach. Tu bym poszedł w uniona all:

SELECT
	LOGIN
	,NAZWISKO
	,RODZAJ
	,SUM(IL_1) IL_1
	,SUM(IL_2) IL_2
	,SUM(IL_3) IL_3
	,SUM(IL_4) IL_4
from (
	SELECT 
		   SUPDN.CODPRP AS LOGIN,
		   UTI.NOMPRP AS NAZWISKO,
		   VTLP.CIRPIC AS RODZAJ,
		   SUM(CASE WHEN VTLE.TYPVTL = 3 THEN 1
					ELSE NULL
		   END) AS IL_1,
		   SUM(CASE WHEN VTLE.TYPVTL = 2 THEN SUPDN.UVCLIV / SUPDN.PCBPRO
					ELSE NULL
		   END) AS IL_2,
		   0.00 IL_3,
		   0.00 IL_4
	FROM BIBLIOTEKA.GEVTLP AS VTLP LEFT JOIN BIBLIOTEKA.GEVTLE AS VTLE ON VTLP.NUMVTL = VTLE.NUMVTL,
		 BIBLIOTEKA.GESUPDN AS SUPDN LEFT JOIN BIBLIOTEKA.GEZPRP AS UTI  ON SUPDN.CODPRP = UTI.CODPRP
	WHERE SUPDN.DATPRB2 BETWEEN ? AND ?
	GROUP BY SUPDN.CODPRP, UTI.NOMPRP, VTLP.CIRPIC, VTLE.TYPVTL

	UNION ALL

	SELECT 
	DBSE.MAJUTI AS LOGIN,
	UTI.NOMPRP AS NAZWISKO,
	DBSE.CIRPIC AS RODZAJ,
	0.00 IL_1,
	0.00 IL_2,
	SUM(DBSE.CUMUOT1) AS IL_3,
	0.00 IL_4
	FROM BIBLIOTEKA.GEDBSE AS DBSE LEFT JOIN BIBLIOTEKA.GEZPRP AS UTI  ON DBSE.MAJUTI = UTI.CODPRP
	WHERE DBSE.MAJDAT BETWEEN ? AND ?
	GROUP BY DBSE.MAJUTI, UTI.NOMPRP, DBSE.CIRPIC

	UNION ALL

	SELECT 
	JNL.CODUTI AS LOGIN,
	UTI.NOMPRP AS NAZWISKO,
	case 
	when  JNL.CODACT = '850' then '720'
	when  JNL.CODACT = '860' then '710'
	when  JNL.CODACT = '870' then '810'
	else ' ' end AS RODZAJ,
	0.00 IL_1,
	0.00 IL_2,
	0.00 IL_4,
	SUM(JNL.SNUPAL) AS IL_4
	FROM BIBLIOTEKA.GEJNL AS JNL LEFT JOIN BIBLIOTEKA.GEZPRP AS UTI  ON JNL.CODUTI = UTI.CODPRP
	WHERE JNL.DATMVT BETWEEN ? AND ?
	GROUP BY JNL.CODUTI, UTI.NOMPRP, JNL.CODACT
	) DANE
GROUP BY
	LOGIN
	,NAZWISKO
	,RODZAJ

0

dziękuję za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1