Avatar
Maros2470
Člen
Avatar
Maros2470:

Zdravím všechny. Potřeboval bych poradit z dotazem na databázi. Mám napsán dotaz takto:

string connectionString = cesta;
                using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
                {
                    spojeni.Open();
                    string dotaz = "SELECT s. SkladId, s.CenikId, s.UzivatelId, s.JednotkaId, s.ZrcadloId, s.Nakup, s.Zasoby, s.Zustatek, s.Sklad, s.Trzba, s.Datum, u.UzivatelId, u.Prijmeni, j.JednotkaId, j.Jednotka, c.CenikId, c.Zbozi, c.Cena, c.JednotkaId FROM Sklad s LEFT JOIN Cenik c ON s.CenikId = c.CenikId AND s.JednotkaId = c.JednotkaId LEFT JOIN Uzivatel u ON s.UzivatelId = u.UzivatelId LEFT JOIN Jednotky j ON s.JednotkaId = j.JednotkaId ";
                    using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
                    using (DataSet vysledky = new DataSet())
                    {
                        adapter.Fill(vysledky);
                        foreach (DataRow radek in vysledky.Tables[0].Rows)
                        {

                            skladDataGrid.Rows.Add(radek["SkladId"], radek["CenikId"], radek["UzivatelId"], radek["JednotkaId"], radek["ZrcadloId"], radek["Zbozi"], radek["Cena"], radek["Nakup"], radek["Zasoby"], radek["Sklad"], radek["Jednotka"], radek["Trzba"], radek["Prijmeni"], radek["Datum"]);  // načtení ceníku
                        }
                    }
                    spojeni.Close();
                }

Potřeboval bych poradit jak tento dotaz upravit, abych získal výpis položek s nejvyšším datumem.

Děkuji za rady

 
Odpovědět 26.6.2014 8:35
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Maros2470
Jiří Gracík:

Přidáš jen na konec dotazu

ORDER BY s.Datum DESC
LIMIT 1
Nahoru Odpovědět 26.6.2014 8:43
Creating websites is awesome till you see the result in another browser ...
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Jiří Gracík
Jiří Gracík:

Nevím co myslíš tím nejvyšším datumem, s limitem ti to vrátí pouze jednu s tím nejvyšším datumem, bez něj seřazené od nejnovější po nejstarší.

Nahoru Odpovědět 26.6.2014 8:44
Creating websites is awesome till you see the result in another browser ...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Jiří Gracík
Maros2470:

Jedná se o sklad, kde každá změna u položky skladu se ukládá jako nový záznam. Po načtení databáze do gridu potřebuji zobrazit všechny položky skladu s nejvyšším datem. Asi bude problém s tím, že mi to načte jen tu položku, kde je nejvyšší datum. V podstatě potřebuji u každé položky načíst tu s poslední změnou.

Editováno 26.6.2014 8:59
 
Nahoru Odpovědět 26.6.2014 8:57
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Maros2470
Jiří Gracík:

Dej mi příklad, asi nechápu, co jsou všechny položky s nejvyšším datem :D

Editováno 26.6.2014 10:31
Nahoru Odpovědět 26.6.2014 10:31
Creating websites is awesome till you see the result in another browser ...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Jiří Gracík
Maros2470:

Ve skladu jsou např. Cihla, Cement, Vápno.

23.6.2012 Cihla cena 5,-
23.6.2012 Vápno cena 140,-
23.6.2012 Cement cena 135,-
24.6.2013 Cihla cena 5,50
25.7.2014 Vápno cena 155,-
26.9.2014 Cement cena 145,-

Potřebuji načíst
24.6.2013 Cihla cena 5,50
25.7.2014 Vápno cena 155,-
26.9.2014 Cement cena 145,-

Prostě poslední změny u všech položek

 
Nahoru Odpovědět 26.6.2014 11:15
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Maros2470
Jiří Gracík:
SELECT id, name, price, max(date)
FROM `devbook_obchod`
GROUP BY name

Doplň si tam ten join a je to hotové :)

Nahoru Odpovědět 26.6.2014 12:03
Creating websites is awesome till you see the result in another browser ...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Jiří Gracík
Maros2470:

Na vyzkoušení jsem si udělal dvě tabulky, napsal jsem to takto:

string connectionString = @"Data Source=MyDatabase.sdf";
            using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
            {
                spojeni.Open();
                string dotaz = "SELECT a.Id, a.Clovek, a.BarvaId, MAX(a.Datum), b.Id, b.Barva FROM Lidi a LEFT JOIN Barvy b ON a.BarvaId = b.Id GROUP BY a.Id  ";
                using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
                using (DataSet vysledky = new DataSet())
                {
                    adapter.Fill(vysledky);
                    foreach (DataRow radek in vysledky.Tables[0].Rows)
                    {

                        dataGridView1.Rows.Add(radek["Id"], radek["BarvaId"], radek["Clovek"], radek["Barva"], radek["datum"] );
                    }
                }
                spojeni.Close();
            }

ale vyhazuje mi to chybu: In aggregate and grouping expressions, the SELECT clause can contain only aggregates and grouping expressions. [ Select clause = a,Clovek ]

Dělám to jako CE databázi

Editováno 26.6.2014 15:13
 
Nahoru Odpovědět 26.6.2014 15:12
Avatar
vidlec
Člen
Avatar
vidlec:

Zkus použít Select distinct s.JmenoVyrobku, s.SkladId, atd..

Na konci musí být ORDER BY datum, nebo co já vím, jak to chceš řadit

 
Nahoru Odpovědět 26.6.2014 15:52
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Maros2470
Jiří Gracík:

Nikdy jsem v CE nedělal, tady už bohužel neporadím.

Nahoru Odpovědět 26.6.2014 16:36
Creating websites is awesome till you see the result in another browser ...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Maros2470
Jan Vargovský:

Když používáš agregační funkce (sum, max, avg, ...) tak musíš dát všechny ostatní sloupce do klauzule group by.

 
Nahoru Odpovědět 26.6.2014 16:39
Avatar
Maros2470
Člen
Avatar
Odpovídá na Jan Vargovský
Maros2470:

Možná se mi to podařilo složitě, alu funguje mi to. Mám to takto:

string connectionString = @"Data Source=MyDatabase.sdf";
            using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
            {
                spojeni.Open();
                string dotaz = "SELECT l.Id, l.BarvaId,  l.Clovek, l.Datum, b.Id, b.Barva FROM Lidi l LEFT JOIN Barvy b ON l.BarvaId = b.Id JOIN (SELECT Clovek, max(Datum) Datum FROM Lidi GROUP BY Clovek) k2 ON l.Clovek=k2.Clovek AND l.Datum=k2.Datum ";
                using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
                using (DataSet vysledky = new DataSet())
                {
                    adapter.Fill(vysledky);
                    foreach (DataRow radek in vysledky.Tables[0].Rows)
                    {

                        dataGridView1.Rows.Add(radek["Id"], radek["BarvaId"], radek["Clovek"],radek["Barva"], radek["Datum"]);
                    }
                }
                spojeni.Close();
            }

Funguje to, ale nevím zda je to optimální řešení

 
Nahoru Odpovědět 26.6.2014 17:19
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Maros2470
Jan Vargovský:
"SELECT a.Id, a.Clovek, a.BarvaId, MAX(a.Datum), b.Id, b.Barva FROM Lidi a LEFT JOIN Barvy b ON a.BarvaId = b.Id GROUP BY a.Id, a.Clovek, a.BarvaId, b.Id, b.Barva";
 
Nahoru Odpovědět 26.6.2014 17:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.