zapytanie o unikatowa liste z najswiezsza data

0

Witam,

Tworze sobie prosta raport w accessie ale nie potrafie za pomoca tam umieszczonych narzedzi wygenerowc takiego zapytania. Sadze ze bedzie to trzeba napisac w SQL i wkleic.

Dla uproszczenia wszystkie dane sa w jednej tabeli ScreenShot_20160224112850.jpeg

Chodzi mi zeby raport wyswietlil unikatowa liste maszyn(filed1'Machine_Name) dla danego zakladu(field2 Machine_Site) i odpowiadajcymi im parametrami(filed3 & field4, Machine_type & Machine_witdth). Jezeli maszyna sie powtarza to maja byc wyswietlone najnowsze parametry czyli z najswiezsza data (field5, updated). Oto przykladowa odpowiedz dla zakladu Bytom:

PW9 Bytom smieciarka 1000
Slitter Bytom ciecie 900

Dziekuje z gory za pomoc wam to pewnie zajmie chwile a ja juz sie tu glowie z godzine kombinujac z grupowaniem itd.

Zalaczam obrazek tabeli.

Pozdrawiam

Piotrek

0

użyj

 group by

i max

0

no tak tez robilem ale nie potrafie tego poprawnie zefiniowac :-( zeby wyswietlal pozostale parametry machine type i machine width

 
SELECT DISTINCT Machine_Name, max(updated)
FROM tblMachines
WHERE Machine_Site ='Bytom'
GROUP BY Machine_Name;
1

Nie wiem jak w access ale w mssql to będzie tak:

with cte as (
select ROW_NUMBER() over (PARTITION BY t.machine_site, t.machine_name, t.machine_type order by t.updated desc) as rnk,
                    t.machine_name, t.machine_site, t.machine_type , t.machine_width
			   from tabela t)
select c.* from cte c
 where c.rnk = 1              
0

dziekuje za pomoc ale wyrzuca mi nastepujacy komunikat:

"Invalid SQL statement; expected 'Delete', 'Insert', 'PROCEDURE', 'SELECT' or 'UPDATE'

0

Pewnie dlatego, że nie rozumiem partition by lub with. Nie mam pod ręką accessa ale myślę, że odpowiednim joinem też będziesz w stanie to zrobić lub podzapytaniem ;)

2
select * from cos where (sam, zakl, data) in (select sam, zakl, max(data) from cos group by sam, zakl)

pola i nazwę tabeli sobie sobie na własne.

0

Wyglada na to ze nawet przypisanie pol wykracza poza moje mozliwosci (co jest dosyc smutne niestety) bo dostaje komunikat z bledem.

Zakladam ze** cos** to musi byc nazwa tabeli w moim przypadku: tblMachines

zak to nazwa pola z zakladem: Machine_Site czy tez okreslony zaklad Machine_Site ='Bytom'

natomiast** sam** to nie mam pojecia co to moze byc.

Jezeli bylbys tak uprzejmy i wkleil pelne polecanie z moimi nazwami pol to bylbym bardzo wdzieczny

Jak to Kmicic w potopie powiedzial: Koncz wasc wstydu oszczedz :-)

Pozdrawiam

Piotrek

0

nie napisalem jaki blad otrzymuje bo prawdopodobnie wynika on z braku umiejetnosci prawidlowego przypisania pol.

Oto co otrzymalem:

"You have written a subquery that can return more than one field without using the EXISTS reserved word in the main query's FROM clause. Revise select statement from subquery to request only one field."

1

no dobra access nie obsługuje takich zapytań. To będzie tak najprawdopodobniej (nie miałem z accesem czy mssqlem za dużo do czynienia) tak

SELECT * FROM tblMachines m1 WHERE EXISTS (SELECT * FROM tblMachines m2 WHERE m1.Machine_Site = m2.Machine_Site AND m1.Machine_Name=m2.Machine_Name GROUP BY Machine_Site, Machine_Name HAVING m1.updated = max(m2.updated))
0

Dziekuje abrakadaber teraz juz dziala trzeba bylo zrobic drobny adjustment ale z tym juz sobie poradzilem. Sorki zem taki niekumaty w tym SQLu :-) ale informatyk to ja nie jestem.

SELECT Machine_Name, machine_site, Machine_type, Machine_Width FROM tblMachines m1 WHERE EXISTS (SELECT Machine_Name FROM tblMachines m2 WHERE m1.Machine_Site = 'Bytom' AND m1.Machine_Name=m2.Machine_Name GROUP BY Machine_Site, Machine_Name HAVING m1.updated = MAX(m2.updated))

Mam jeszcze jedno pytanie, bo widzialem takie programy w necie do upgradowania bazy danych z accessa do MS SQL server, a na tym przypadku widac ze skladnia SQL rozni sie troche pomiedzy tymi dwoma programami. Czy te programy konwertuja zapytania poprawnie czy trzeba pozniej duzo recznych korekt wprowadzic?

jeszcze raz dzieki za pomoc na tym etapie mojej wiedzy to bym wzyciu tego nie napisal sam.

Pozdrawiam

piotrek

0

mam jeszcze jedno pytanie bo jak sam to robie to oczywiscie wychodza jakies dziwne rzeczy.
Gdybym chcial ograniczyc dzialanie funkcji max do mniejszej liczby rekordow np. <= jakas data. Probpwalem zrobic to na dwa soposoby ale w jednym otrzymalem blad:

"This expression is typed incorrectly, or it is too complex to be evaluated. For example, a numeric expression may contain too many complicated elements. Try simplifying the expression by assigning parts of the expression to variables."

 
SELECT Machine_Name, machine_site, Machine_type, Machine_Width
FROM tblMachines AS m1
WHERE EXISTS (SELECT Machine_Name FROM tblMachines m2 WHERE m1.Machine_Site =[zaklad] AND m1.Machine_Name=m2.Machine_Name GROUP BY Machine_Site, Machine_Name 
HAVING m1.updated = max(m2.updated < '01/01/2014'));

a jak robie to w ten sposob to wyniki sa niepoprawne, albo i poprawne dla nieprawidlowego mojego zapisu :-)

 SELECT Machine_Name, machine_site, Machine_type, Machine_Width
FROM tblMachines AS m1
WHERE EXISTS (SELECT Machine_Name FROM tblMachines m2 WHERE m1.Machine_Site =[zaklad] AND m1.Machine_Name=m2.Machine_Name GROUP BY Machine_Site, Machine_Name 
HAVING m1.updated = max(m2.updated) < '01/01/2014');

Czy jest jakis prosty sposob zeby to zrobic?

Pozdrawiam

Piotrek

0

Siedze jeszcze nad tym problemem i chyba metoda prob i bledow doszedlem czesiowo do zadowalajacego efektu.

 
SELECT Machine_Name, machine_site, Machine_type, Machine_Width
FROM tblMachines AS m1
WHERE EXISTS (SELECT Machine_Name FROM tblMachines m2 WHERE m1.Machine_Site =[zaklad] AND m1.Machine_Name=m2.Machine_Name AND m1.updated <= [data] GROUP BY Machine_Site, Machine_Name
HAVING m1.updated = max(m2.updated));

tylko nie rozumiem jednej rzeczy, jak data jest wprowadzona jako parametr zmienny to kod dziala poprawnie, a jak wpisze jako stala to wyswietla mi komunikat ze zapytanie jest zbyt skomplikowane. Czy ja wprowadzam date w zlym formacie?

"This expression is typed incorrectly, or is too complex to be evaluated...."

 
SELECT Machine_Name, machine_site, Machine_type, Machine_Width
FROM tblMachines AS m1
WHERE EXISTS (SELECT Machine_Name FROM tblMachines m2 WHERE m1.Machine_Site =[zaklad] AND m1.Machine_Name=m2.Machine_Name AND m1.updated <= '25/02/2016' GROUP BY Machine_Site, Machine_Name
HAVING m1.updated = max(m2.updated));

1 użytkowników online, w tym zalogowanych: 0, gości: 1