2011-10-24 22 views
11

Mam dwie tabele. Różnić się tym, że archiwum jest tabelą, a drugie zawiera bieżący rekord. Są to tabele rejestrujące sprzedaż w firmie. W obu mamy między innymi: identyfikator, nazwę, cenę sprzedaży. Muszę wybrać z obu tabel, najwyższą i najniższą cenę dla danej nazwy. Starałem się zrobić z zapytaniem:wybierz maksimum, min wartości z dwóch tabel

select name, max (price_of_sale), min (price_of_sale) 
from wapzby 
union 
select name, max (price_of_sale), min (price_of_sale) 
from wpzby 
order by name 

ale takie zapytanie zwraca mi dwa rekordy - jeden z bieżącej tabeli, jeden archiwalnych stołowego. Chcę wybrać nazwę dla najmniejszej i największej ceny natychmiast z obu tabel. Jak uzyskać to zapytanie?

+2

Jaki silnik SQL jest? Moim oczom brakuje GRUPY BY (aby agregować MIN i MAKS wokół każdej odrębnej "nazwy") i klauzuli WHERE (aby ograniczyć się do tylko jednej "nazwy"). – pilcrow

Odpowiedz

1

Czy to bardziej przypomina to, co chcesz?

SELECT 
    a.name, 
    MAX (a.price_of_sale), 
    MIN (a.price_of_sale) , 
    b.name, 
    MAX (b.price_of_sale), 
    MIN (b.price_of_sale) 
FROM 
    wapzby a, 
    wpzby b 
ORDER BY 
    a.name 

To niesprawdzone ale powinien zwrócić wszystkie rekordy w jednym rzędzie bez potrzeby unii

+0

Jeśli jest piwo w, a ser w b ... On dostanie wiersz w wyniku o piwo i ser. Nie sądzę, że cartesian join jest tym, czego chce. –

6

W SQL Server można użyć subquery:

SELECT [name], 
     MAX([price_of_sale]) AS [MAX price_of_sale], 
     MIN([price_of_sale]) AS [MIN price_of_sale] 
FROM (
    SELECT [name], 
      [price_of_sale] 
    FROM [dbo].[wapzby] 
    UNION 
    SELECT [name], 
      [price_of_sale] 
    FROM [dbo].[wpzby] 
) u 
GROUP BY [name] 
ORDER BY [name] 
22

Oto dwie opcje (MSSQL zgodny)

Uwaga: UNION ALL połączy zestawy bez eliminowania duplikatów. To znacznie prostsze zachowanie niż UNION.

SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice 
FROM 
(
    SELECT Name, Price_Of_Sale 
    FROM wapzby 
    UNION ALL 
    SELECT Name, Price_Of_Sale 
    FROM wpzby 
) as subQuery 
GROUP BY Name 
ORDER BY Name 

Ten określa maksymalną i minimalną wartość każdej tabeli przed połączeniem zestawu - może być bardziej wydajne, aby zrobić to w ten sposób.

SELECT Name, MAX(MaxPrice) as MaxPrice, MIN(MinPrice) as MinPrice 
FROM 
(
    SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice 
    FROM wapzby 
    GROUP BY Name 
    UNION ALL 
    SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice 
    FROM wpzby 
    GROUP BY Name 
) as subQuery 
GROUP BY Name 
ORDER BY Name 
+0

Dzięki - to jest to, czego chcę – BKl

1
SELECT MAX(value) FROM tabl1 UNION SELECT MAX(value) FROM tabl2; 
SELECT MIN(value) FROM tabl1 UNION SELECT MIN(value) FROM tabl2; 
+0

Być może pomoże ci opisanie tego, co robi sql i sformatowanie go pod kątem czytelności. –

Powiązane problemy