Dwa kody robiące to samo?

0

Przygotowuję się do kolokwium z baz danych i nie za bardzo potrafię zrozumieć jednej rzeczy.

Mamy trzy połączone ze sobą tabele Serwis, usługi serwisowe i aso. Chcemy wybrać liczbę serwisowanych pojazdów(ogólnie) i sumę usług za poprzedni rok(mozna przyjąc ze za 2013) oraz odpowiednio posortować.

A pytanie jest takie: czy taki kod sql napisany przez nie wiem jakiego asa:

select historia.IdASO, historia.NazwaASO, sum(liczba_poj), sum(wartosc) from
(select a.IdASO, a.NazwaASO, count(*) liczba_poj, sum(CenaUslugi) wartosc
from UsługiSerwisowe us
inner join Serwis s on s.IdSerwisu = us.IdSerwisu
inner join ASO a on a.IdASO = s.IdASO
where year(s.DataSerwisu)>=year(getdate())-3
group by a.IdASO, a.NazwaASO
union all
select a.IdASO, a.NazwaASO, count(*) liczba_poj, sum(CenaUslugi) wartosc
from HSerwis hs
inner join HUsługiSerwisowe hu on hu.IdSerwisuH = hs.IdSerwisuH
inner join Usługa u on u.IdUsługi = hu.IdUsługi
inner join UsługiASO usa on usa.IdUsługi = u.IdUsługi
inner join ASO a on a.IdASO = usa.IdASO
where year(hs.DataSerwisu)>=year(getdate())-3
group by a.IdASO, a.NazwaASO)
as historia
group by historia.IdASO, historia.NazwaASO
order by sum(liczba_poj) desc

byłby równoważny z krótkim napisaniem:

select idAso, NazwaAso, count(distinct LiczbaUslug), sum(cena_uslug*liczbaUslug) from ASO 
Inner join Serwis on IdAso=Idaso 
Inner join uslugi_serwisowe on id_serwisu=id_serwisu
where year(Data_serwisu)=2013
group by 1,2
order by 3 desc

Nie będę ukrywał, że przygotowuję sie do kolokwium i przeglądając jakieś materiały natknąłem się na ten dłuugi zapis i zastanowiłem się, czy z moim jest coś nie tak.

0

o_O?
Jedno zapytanie wyciąga aktualne usługi serwisowe i usługi historyczne, drugie wyciąga tylko aktualne.

0

A gdyby w tym pierwszym kodzie wywalić to co jest po union i napisać tylko:

SELECT historia.IdASO, historia.NazwaASO, SUM(liczba_poj), SUM(wartosc) FROM
(SELECT a.IdASO, a.NazwaASO, COUNT(*) liczba_poj, SUM(CenaUslugi) wartosc
FROM UsługiSerwisowe us
INNER JOIN Serwis s ON s.IdSerwisu = us.IdSerwisu
INNER JOIN ASO a ON a.IdASO = s.IdASO
WHERE YEAR(s.DataSerwisu)>=YEAR(getdate())-3
GROUP BY a.IdASO, a.NazwaASO)
AS historia
GROUP BY historia.IdASO, historia.NazwaASO
ORDER BY SUM(liczba_poj) DESC

To czy teraz są równoważne?

0

Ty pytasz poważnie? o_O
Przecież w jednym używasz tabel HUsługiSerwisowe czy HSerwis a w drugim nie. Będą równoważne chyba jak te tablele z H* są puste...

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