Adrian Stolarski

Wypowiedzi autora zostały ukryte. Pokaż autora

Temat: pytanie o pobranie rekordów z miesiąca poprzedniego

Podajesz numery wybranych miesięcy ręcznie, czy to ma być automat dla wszystkich miesięcy?

Tabela i dane:
CREATE TABLE tab(id INT IDENTITY(1, 1), cos VARCHAR(10), miesiac INT, rok INT)
INSERT INTO tab VALUES('aaa', 10, 2000)
INSERT INTO tab VALUES('bbb', 10, 2000)
INSERT INTO tab VALUES('ccc', 10, 2000)
INSERT INTO tab VALUES('ddd', 10, 2000)
INSERT INTO tab VALUES('xxx', 11, 2000)
INSERT INTO tab VALUES('yyy', 11, 2000)
INSERT INTO tab VALUES('aaa', 11, 2000)
INSERT INTO tab VALUES('ddd', 11, 2000)
INSERT INTO tab VALUES('zzz', 11, 2000)


Kwerenda
* nie wiem, jaki silnik bazy danych Cię interesuje, ale zapytanie jest ANSI92 więc powinno działać wszędzie.
** nie wiem, czy ID to (alfa)numeryczny identyfikator (kod) tego "Coś" czy po prostu klucz główny (unikalne wartości)? Jeśli ID to identyfikator "Cosia", to można joinować po nim. Jeśli to klucz tabeli, to jako atrybut złączenia pozostaje jedynie "Coś". Należy wtedy założyć indeks na "Coś", bo inaczej wyszukiwanie będzie wolne.

SELECT t1.id, t1.cos, t1.miesiac, t1.rok 
FROM
(SELECT * FROM tab WHERE miesiac = 10) t1
LEFT JOIN
(SELECT * FROM tab WHERE miesiac = 11) t2
ON t1.cos=t2.cos
WHERE t2.cos IS NULL


Wynik:
id	cos	miesiac	rok
2 bbb 10 2000
3 ccc 10 2000


Lub prościej (ale mniej elastycznie):
SELECT cos FROM tab WHERE miesiac = 10
EXCEPT
SELECT cos FROM tab WHERE miesiac = 11


cos
bbb
ccc
Ten post został edytowany przez Autora dnia 10.10.14 o godzinie 15:21
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: pytanie o pobranie rekordów z miesiąca poprzedniego

Kolega powiedział:
"Te rekordy, które są w poprzednim miesiącu a nie są w bieżącym".

Do zapytań SQL dodałbym jeszcze zamiast miesięcy na sztywno wyliczenie miesięcy. Dla PostgreSQL przykładowo to
-- Miesiąc bieżący
SELECT DATE_PART('month', NOW())

-- Miesiąc poprzedni
SELECT DATE_PART('month', NOW()) - 1

W MySQL:
-- Miesiąc bieżący
SELECT MONTH(CURDATE());

-- Miesiąc poprzedni
SELECT MONTH(CURDATE()) - 1

Temat: pytanie o pobranie rekordów z miesiąca poprzedniego

No nie bardzo. Kolega napisał:
[...]w miesiacu poprzednim i nie wystepują w danym miesiacu?

A zatem nie bieżącym, lecz danym, a to zasadnicza różnica. Dany miesiąc może być bieżącym, jeśli tak został ustawiony. Chodzi o porównanie listy produktów z dwóch kolejnych miesięcy, z których późniejszy jest zadawany przez użytkownika. W ogólnym przypadku nie będzie to zatem ani NOW() ani CURDATE().

Wiedząc, o jaki silnik chodzi, można podać kod z użyciem zmiennej, z której zostanie wyliczony miesiąc poprzedni w stosunku do zadanego.Ten post został edytowany przez Autora dnia 12.10.14 o godzinie 06:30
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: pytanie o pobranie rekordów z miesiąca poprzedniego

Masz rację. Mój błąd.
Eh to moje czytanie ze zrozumieniem po meczu :)



Wyślij zaproszenie do