• 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
1,101 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ź 315 wizyt
pytanie zadane 25 listopada 2018 w SQL, bazy danych przez niezalogowany
0 głosów
1 odpowiedź 301 wizyt
pytanie zadane 6 maja 2022 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 824 wizyt

92,845 zapytań

141,784 odpowiedzi

320,859 komentarzy

62,178 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...