Proszę o pomoc w scaleniu tych 2 zapytań, próbowałem użyć UNION i otrzymuję błąd w wyniku

--Pierwsze zapytanie

select  p.pegawainama,r.pegawainid, sum(cast(round(r.besarpotongan,0) as int)) as totalpotnondinas 
from 
    rpotongan r
inner join 
    pegawai p on p.pegawainid=r.pegawainid
where 
    r.nojenpot not in (1,7,6,12,14)
    --and r.pegawainid = '6290134A'
    and r.bulan = '3'
    and r.tahun = '2012'
    and p.kodebayar = '152012'
group by
    r.pegawainid,
    p.pegawainama
order by
    p.pegawainama,
    sum(cast(round(r.besarpotongan,0) as int))

--Drugie zapytanie

select p.pegawainama, r.pegawainid, sum(cast(round(r.besarpotongan,0) as int)) as totalpotdinas from rpotongan r 
inner join 
    pegawai p on p.pegawainid=r.pegawainid
where 
    r.nojenpot in (1,7,6,12,14)
    --and r.pegawainid = '6290134A'
    and r.bulan = '3'
    and r.tahun = '2012'
    and p.kodebayar = '152012'
group by
    r.pegawainid,
    p.pegawainama
order by
    p.pegawainama,
    sum(cast(round(r.besarpotongan,0) as int))
-1
Arief Grando 21 luty 2012, 06:34

2 odpowiedzi

Najlepsza odpowiedź

Aby użyć UNION, musisz mieć te same nazwy kolumn, więc nie możesz mieć totalpotnondinas w jednym zapytaniu i totalpotdinas w drugim.

To, co możesz zrobić, to wywołać obie kolumny totals i dodać dodatkową kolumnę, która wskazuje, które zapytanie było źródłem danych. Na przykład:

select p.pegawainama,r.pegawainid, sum(cast(round(r.besarpotongan,0) as int)) as total,
'potnondinas' as src from rpotongan r inner join pegawai p on p.pegawainid=r.pegawainid 
where r.nojenpot not in (1,7,6,12,14) --and r.pegawainid = '6290134A' and r.bulan = '3'
and r.tahun = '2012' and p.kodebayar = '152012' group by r.pegawainid, p.pegawainama
order by p.pegawainama, sum(cast(round(r.besarpotongan,0) as int))

--Drugie zapytanie

select p.pegawainama, r.pegawainid, sum(cast(round(r.besarpotongan,0) as int)) as total, 
'potdinas' as src from rpotongan r inner join pegawai p on p.pegawainid=r.pegawainid
where r.nojenpot in (1,7,6,12,14) --and r.pegawainid = '6290134A' and r.bulan = '3'
and r.tahun = '2012' and p.kodebayar = '152012' group by r.pegawainid, p.pegawainama
order by p.pegawainama, sum(cast(round(r.besarpotongan,0) as int))

Jeśli pominiesz kolumnę syntetyczną src, UNION połączy identyczne wyniki.

0
Devon_C_Miller 21 luty 2012, 06:43

Nie jestem pewien, jak to są dwa różne zapytania, z wyjątkiem różnych aliasów, ale możesz mieć tylko jedno ORDER BY w UNION (komunikat o błędzie powinien dokładnie to powiedzieć). Próbować:

select  p.pegawainama,r.pegawainid, sum(cast(round(r.besarpotongan,0) as int))
     as totalpotnondinas 
from 
    rpotongan r
inner join 
    pegawai p on p.pegawainid=r.pegawainid
where 
    r.nojenpot not in (1,7,6,12,14)
    --and r.pegawainid = '6290134A'
    and r.bulan = '3'
    and r.tahun = '2012'
    and p.kodebayar = '152012'
group by
    r.pegawainid,
    p.pegawainama
union all
select p.pegawainama, r.pegawainid, sum(cast(round(r.besarpotongan,0) as int))
    as totalpotnondinas 
from 
    rpotongan r 
inner join 
    pegawai p on p.pegawainid=r.pegawainid
where 
    r.nojenpot in (1,7,6,12,14)
    --and r.pegawainid = '6290134A'
    and r.bulan = '3'
    and r.tahun = '2012'
    and p.kodebayar = '152012'
group by
    r.pegawainid,
    p.pegawainama
order by
    pegawainama,
    totalpotnondinas;

Jeśli chcesz, aby kolumna SUM() była czytelna między dwoma wynikami, użyj SUM... AS col1, NULL AS col2 w pierwszym zapytaniu i NULL AS col1, SUM... AS col2 w drugim.

0
Aaron Bertrand 21 luty 2012, 06:45