• 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

0 głosów
179 wizyt
pytanie zadane 1 maja 2017 w SQL, bazy danych przez xyuru Użytkownik (940 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 Maniak (65,670 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ź 36 wizyt
pytanie zadane 25 listopada 2018 w SQL, bazy danych przez Raptor Mądrala (5,750 p.)
0 głosów
1 odpowiedź 86 wizyt
0 głosów
1 odpowiedź 110 wizyt
pytanie zadane 7 czerwca 2017 w SQL, bazy danych przez michal0803 Użytkownik (500 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

64,048 zapytań

110,437 odpowiedzi

231,289 komentarzy

47,817 pasjonatów

Przeglądających: 221
Pasjonatów: 6 Gości: 215

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...