Moi, Millaisella kyselyllä saisin esimerkin kaltaisen tuloksen?
Taulu: Myyntipaikka | (PK) | | | PaikkaID | Nimi | |----------|---------| | 1 | paikka1 | | 2 | paikka2 | |----------|---------| Taulu: Myyntitapahtuma | (PK) | (FK) | | | | TapahtumaID | PaikkaID | pvm | summa | |-------------|----------|------------|-------| | 1 | 1 | 2017-10-03 | 100 | | 2 | 1 | 2017-10-03 | 200 | | 3 | 2 | 2017-10-03 | 150 | | 4 | 1 | 2017-10-04 | 500 | | 5 | 2 | 2017-10-05 | 99 | | 6 | 2 | 2017-10-05 | 800 | |-------------|----------|------------|-------| Nyt hauluaisin sql kyselyllä saada seuraavanlaisen taulun: | Nimi | pvm | yhteensä | |---------|------------|----------| | paikka1 | 2017-10-03 | 300 | | paikka2 | 2017-10-03 | 150 | | paikka1 | 2017-10-04 | 500 | | paikka2 | 2017-10-04 | NULL | | paikka1 | 2017-10-05 | NULL | | paikka2 | 2017-10-05 | 899 | |---------|------------|----------|
Ilman noita nulleja olisi triviaali. Jättäisin nullit generoimatta tietokannassa:
SELECT p.Nimi, t.pvm, sum(t.summa) yhteensä FROM Myyntipaikka p JOIN Myyntitapahtuma t ON p.PaikkaID=t.PaikkaID ORDER BY t.pvm, p.Nimi
Hei Grez.
Taulusta on tarkoitus näyttää vain valitun pvm:n tiedot kerrallaan (bindingsource filter).
Saan kyllä haettua tarvittavat pvm kohtaiset tiedot kannasta aina kun pvm vaihdetaan, mutta koska kanta on ulkoisella serverillä, aiheutuu siitä häiritsevän pitkä viive.
Jos saisin ladattu pidemmän aikavälin datan valmiiksi datasettiin formin avautuessa, ei viivettä aiheutuisi. Ja on tärkeää, että kaikki myyntipaikat ovat aina näkyvissä, oli niissä myyntiä tai ei.
Toki ratkaisuja on varmasti muitakin ja mielelläni otan ideoita vastaan, mutta tuollaisen taulun tuottava sql komento nyt vain olisi näppärä tässä tilanteessa.
No nyt aamulla tarkemmin ajatellen, ei tuo ehkä sittenkään ole hyvä idea.
Haluaisin siis, että datagriviewissä näkyisi kokoajan lista myyntipaikoista ja myyntipaikan perässä paikan yhteismyynti, joka vaihtuisi aina valitun pvm:n mukaan... mitenhän tuon toteuttaisi?
Edit: taisin jo keksiä ratkaisun
No kyllähän se saa ne hakemaan, jos pakko on. Tosin sit voisi auttaa tietää mikä kanta kyseessä, että saisi kirjoitettua tehokkaimman kyselyn.
Luulis, että datagriviewille saisi määriteltyä että siinä näkyy aina kaikki kyselyn koko tuloksella tulleet myyntipaikat, vaikka valittua päivää vaihdetaan.
Ok, eli siis:
-Kanta on MSSQL
-Datasetissä on nuo taulut 'myyntipaikka' ja 'myyntitapahtuma'.
-formilla on usercontol jossa datagriview (tämä tapaus)
-formilla on myös DateTimePicker jolla valitaan pvm..
-datagridviewissä pitäisi näkyä AINA kaikki myyntipaikat ja sitten myynin yhteissumma jos sitä on ('123.00' = myyntiä 123€ / '0' = myyntiä 0€ (kauppa ollut kuitenkin auki) / 'NULL' kauppa ei ole ollut auki). Lisäksi rivillä pitää olla 'PaikkaID' jotta saan selville mikä paikka on valittuna (PaikkaID piilotetaan)
Mistä tietää, milloin kauppa on ollut auki, vaikka myyntiä ei ole? Ilmeisesti ei ainakaan nykyisistä tauluista.
Puuttuvia päivämääriä on suhteellisen hankala generoida useimmilla SQL-tietokannoilla. Yleensä kannattaa hakea tietokannasta vain ne asiat, jotka oikeasti ovat siellä, ja ohjelmassa voi sitten käsitellä puuttuvat kohdat oikein.
Niin itse lähtisin siitä ajatuksesta, että myyntipäivä on sellainen päivä, joka löytyy kannasta mille tahansa myyntipaikalle. Sinänsä olen samaa mieltä Metabolixin kanssa, että puuttuvat kohdat käsiteltäisiin ohjelman päässä - kuten sanoinkin että jättäisin nullit generoimatta tietokannassa.
Mutta siis tosiaan tällaisella kyselyllä se nyt kuitenkin MSSQL:ssä onnistuisi.
WITH Pv AS (SELECT DISTINCT pvm FROM Myyntitapahtuma) SELECT Pa.PaikkaId, Pa.Nimi, Pv.pvm, SUM(T.summa) FROM (MyyntiPaikka Pa JOIN Pv ON 1=1) LEFT JOIN MyyntiTapahtuma T ON Pa.PaikkaId=T.PaikkaId AND Pv.pvm=T.pvm GROUP BY Pa.PaikkaId, Pa.Nimi, Pv.pvm ORDER BY Pv.pvm, Pa.PaikkaId
ok, päätin ottaa neuvostanne vaarin ja luon nullit ohjelmassa. kiitos kuitenkin sql-koodista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.