• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL - ostatnie 3 wiersze tabeli w połączeniu z union

VPS Starter Arubacloud
0 głosów
986 wizyt
pytanie zadane 1 maja 2017 w SQL, bazy danych przez xyuru Obywatel (1,000 p.)
edycja 1 maja 2017 przez xyuru

Witam, 

Na potrzeby aplikacji VB.net potrzebuję wykorzystać zapytanie do SQL Server (v. 2014 Express), które z tabeli X wybierze 4 ostatnie wiersze, następnie te wiersze posortuje malejąco wg daty i do takiej tabeli na końcu dodany zostanie jeden wiersz sumujący wartości z powyższych wierszy. Poradzę sobie w zaangażowaniu VB, dlatego problem na forum przedstawiam w stosunku do zapytania.

To, czego próbowałem  krok po kroku (pomijam funkcje konwertowania dat i wartości na varchar dla przejrzystości kodu):

  1. SELECT Data, Wartosc, 
    FROM X
    WHERE Klient = 1
    ORDER BY Data DESC
    union
    Select 'Suma', sum(Wartosc)
    WHERE Klient = 1
    Dlaczego nie działa? Funkcja ORDER BY nie może być stosowana przed union. 
    No to poprawmy to dodając kolumnę określającą kolejność, aby na końcu ją posortować:
  2. SELECT Data, Wartosc, 1 As Kolejnosc
    FROM X
    WHERE Klient = 1
    union 
    Select 'Suma', sum(Wartosc), 2
    WHERE Klient = 1
    ORDER BY Kolejnosc ASC, Data DESC
    Działa? Tak! Wszystko wyświetla się tak jak chciałem, a kolumnę "Kolejnosc" usunę w VB, zatem nie jest problemem, że teraz się pojawiła. 
    Dodam zapis "TOP 4" żeby osiągnąć założenia cel (ograniczyć te wartości tylko do czterech pierwszych wyników tego zapytania):
  3. SELECT TOP 4 Data, Wartosc, 1 As Kolejnosc
    FROM X
    WHERE Klient = 1
    union 
    Select 'Suma', sum(Wartosc), 2
    WHERE Klient = 1
    ORDER BY Kolejnosc ASC, Data DESC
    No i nie działa. Pojawiają się 4 wartości i są dobrze posortowane, ale są to wartości z "góry" tabeli, natomiast ja potrzebuję wyciągnąć ostatnie 4, a nie 4 pierwsze wartości z tabeli.

Gorąca prośba o pomoc.

 

1 odpowiedź

0 głosów
odpowiedź 1 maja 2017 przez Chess Szeryf (76,710 p.)
edycja 1 maja 2017 przez Chess

Musisz do tego użyć chyba polecenia top. http://tomaszkenig.pl/kurs-sql-server/podstawy-budowania-zapytan-select-w-sql-server/ Odpowiednikiem tego top jest chyba limit w MySQL, ale nie jestem pewien. Jak już ty wspomniałeś powyżej pracujesz na SQL Server.

http://stackoverflow.com/questions/11076568/top-and-order-by-sql-error

Może spróbuj coś w ten deseń:

Najpierw kod z MySQL:

select data,wartosc,1 as kolejnosc from x where klient=1
union all
select data,wartosc,kolejnosc from x where klient=1 order by kolejnosc desc limit 1;

Teraz kod z SQL Server, nie wiem, czy jest poprawny:

select top 1 data,wartosc,1 as kolejnosc from x where klient=1
union all
select top 1 data,wartosc,kolejnosc from x where klient=1 order by kolejnosc desc;
select top 2 * from x union select top 2 * from x order by id asc;

Oczywiście podkreślam iż, wyżej załączony kod jest tylko kodem prototypowym i nie wiem, czy jest on poprawny!!!

Czy limit w MySQL jest tym samym, co top w SQL Server Microsoftu: http://vorg.ca/626-the-MS-SQL-equivalent-to-MySQLs-limit-command

Inne linki: http://stackoverflow.com/questions/971964/limit-10-20-in-sql-server

http://stackoverflow.com/questions/311054/how-do-i-select-last-5-rows-in-a-table-without-sorting

http://stackoverflow.com/questions/12125904/select-last-n-rows-from-mysql

Nie wiem, czy oto ci chodziło, ale chyba oto, co jest w ostatnim linku, czyli ten kod:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

Przerób ten kod powyżej na kod twojego servera bazy danych, czyli w twoim wypadku SQL Server.

Czyli chyba będzie coś takiego:

select top 3 * from ( select top 3 from table order by id desc) sub order by id asc.

Przepisz ten kod powyżej na kod zbliżony, podobny do kodu mysql i dostosuj do własnych potrzeb.

Reasumując, aby wyciągnać ostatnie 3 recordy z tabeli powienieneś użyć najprawdopodobniej polecenia top.

W razie jakiegokolwiek nieprawidłowego napisania kodu bądź też logiki wypowiedzi, która jest błędna szczerze przepraszam. Jeśli coś nie działa to znaczy, że albo kod jest błędny albo, że jest prawidłowy tylko działa albo na serverze mysql lub na SQL Server.

 

Podobne pytania

0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 25 listopada 2018 w SQL, bazy danych przez niezalogowany
0 głosów
1 odpowiedź 275 wizyt
pytanie zadane 6 maja 2022 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 692 wizyt

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...