Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: SQL: Joka myyntipaikan joka päivän myynti kerralla?

Sivun loppuun

ari kood [05.10.2017 12:06:08]

#

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    |
|---------|------------|----------|

Grez [05.10.2017 12:52:20]

#

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

ari kood [05.10.2017 22:56:15]

#

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.

ari kood [06.10.2017 07:15:11]

#

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

Grez [06.10.2017 09:35:11]

#

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.

ari kood [08.10.2017 11:52:20]

#

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)

Metabolix [08.10.2017 12:06:20]

#

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.

Grez [08.10.2017 13:37:14]

#

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

ari kood [11.10.2017 07:55:58]

#

ok, päätin ottaa neuvostanne vaarin ja luon nullit ohjelmassa. kiitos kuitenkin sql-koodista.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta