Avatar billede DMO Novice
19. april 2016 - 15:25 Der er 6 kommentarer og
1 løsning

"Kunder har også købt"

jeg sidder med 2 Ordrelister. lokal og net

kan jeg splejse det sammen og tilsidst få en liste af varer der ligger sammen med det produkt man kigger på

jeg kan godt gøre det ved en af listerne, men jeg kan ikke se hvordan jeg gør det med begge to.

som jeg tænker det skal foregå er at
1 finde ordrenr (som kan være ens) på alle de ordrer der har denne vare i
2 finde alle varer i disse ordre og sortere efter sum(Antal)

prøvet med dette som første trin, men det giver mig
| 1123 | 1244 |
| 1234 | 1244 |
| 4321 | 1244 |
| 1123 | 1555 |
| 1234 | 1555 |
| 4321 | 1555 |
lidt ubrugeligt

SELECT table1.OOrdreNr, table2.LOrdreNr
FROM
(SELECT Ordrelinie.OrdreNr AS OOrdreNr FROM Ordrelinie WHERE Ordrelinie.VareNr = 'blabla' GROUP BY Ordrelinie.OrdreNr) table1
,
(SELECT Lokaleordrelinie.OrdreNr AS LOrdreNr FROM Lokaleordrelinie WHERE Lokaleordrelinie.VareNr = 'blabla' GROUP BY Lokaleordrelinie.OrdreNr) table2

har prøvet lidt forskellige koder, så nu spørger jeg profferne.
en nem eller besværlig løsning, en eller flere sql queries
det er resultatet that matters now.
Avatar billede vagnk Juniormester
21. april 2016 - 10:24 #1
Det ligner en UNION.

SELECT 1, 'local', OrdreNr AS local_ordrer
FROM local.table.table1
WHERE local_ordrer.VareNr = 'blabla'
UNION
SELECT 2, 'remote', OrdreNr AS remote_ordrer
FROM remote.table2
WHERE remote_ordrer.VareNr = 'blabla'
ORDER BY 1

Tricket med at sortere på 1 og 2 giver dig resultaterne fra den første SELECT før den anden. Naturligvis kan du osse sortere på teksten, så skal du bare skrive 2 i ORDER-clause. Hvis du ønsker sortering på de samlede ordrer giver du den samme alias i begge udtræk og sortere på den. Så er det måske stadig interessant at bibeholde det første felt (1 og 2) eller teksten, så du kan se hvor ordren kommer fra.
Avatar billede DMO Novice
21. april 2016 - 11:45 #2
Nice det er lige det jeg kiggede efter.
Jeg viste ikke at man kunne lave en lille fiktiv kolonne med ejet data.
min tanke havde være på union men viste ikke hvordan jeg kunne se forskel på de to ordre typer.

Laver den en ny kolonne bare med
"SELECT 'col1', 'col2'"
som ikke er fra tabellerne?


Ved anden del for at få alle vare i disse ordre har jeg dette.

SELECT VareNr, (Sum(nAntal)) FROM (
SELECT VareNr, Sum(Antal) AS nAntal FROM Ordrelinie WHERE (
///asp kode loop
Ordrelinie.OrdreNr = 2565 OR
Ordrelinie.OrdreNr = 5771
///asp kode loop !!
) AND (Ordrelinie.VareNr != 'blabla')
GROUP BY VareNr
UNION
SELECT VareNr, Sum(Antal) AS nAntal FROM Lokaleordrelinie WHERE (
///asp kode loop
Lokaleordrelinie.OrdreNr = 12335 OR
Lokaleordrelinie.OrdreNr = 38718 OR
Lokaleordrelinie.OrdreNr = 41372
///asp kode loop !!
) AND (Lokaleordrelinie.VareNr != 'blabla')
GROUP BY VareNr
) AS t
GROUP BY VareNr ORDER BY (Sum(nAntal)) DESC

Vis du har noget til den del må du gerne sige det.
ellers giv et svar til point.
Avatar billede vagnk Juniormester
24. april 2016 - 23:05 #3
Lav selv et svar og behold pointene.

Laver den en ny kolonne bare med
"SELECT 'col1', 'col2'"
som ikke er fra tabellerne?

------------------------------
Ja, den helt rigtige ville være "SELECT 'col1' AS kol1, 'col2' AS kol2".

Du har ret. Den med at lave sine egne kolonner er ikke velkendt, men næsten uundværlig når man arbejder med UNION.

Jeg tror det vil kræve lidt for meget af mig at grave mig ind i anden del, og du har vist osse så meget check på det så du selv kan klare den. Hvis ikke så vend tilbage.

Jeg plejer at se UNION som et samlet udtræk af tabeller efter hinanden i modsætning til JOIN hvor udtrækket kommer ved siden af hinanden.
Avatar billede DMO Novice
25. april 2016 - 09:09 #4
Ok takker for hjælpen
Avatar billede vagnk Juniormester
25. april 2016 - 12:45 #5
Hm! Nu kom jeg jo ind på spørgsmålet igen, og så vil jeg da lige komme med et par betragtninger til din anden del.

Uden for din subquery tester du på "AND (Ordrelinie.VareNr != 'blabla')". Jeg går ud fra at VareNr er numerisk så den betingelse vil aldrig (eller rettere - altid) blive opfyldt. Hvis det er for at sikre dig at DB-engine kommer gennem alle rækker,  vil din samlede query i forvejen gennemgå alle rækker. Så mit bud er at du vil få præcist samme resultat med og uden betingelsen. Det eneste du opnår er at give DB-engine mere arbejde med at skrue gennemløbet sammen.

Lokaleordrelinie.OrdreNr = 12335 OR
Lokaleordrelinie.OrdreNr = 38718 OR
Lokaleordrelinie.OrdreNr = 41372

Disse linjer kan erstattes med:
WHERE Lokaleordrelinie.OrdreNr IN (12335, 38718, 41372)
Ikke den store betydning, men giver en mere overskuelig kode.
Vagn
Avatar billede DMO Novice
25. april 2016 - 16:01 #6
VareNr er en VarChar, den virker også som navn og til stregkoder.
Jeg har desværre ikke været med, da man lavede den database ellers havde jeg nok lavet anderledes. Måske.

jeg tænkte på at lave en join til vare tabellen, så jeg kan tjekke det hele på en gang, f.eks. om vare findes eller er på lager. men lige nu er der andre opgaver på skærmen. 

Din anden kode er også smart, jeg skal huske den, når jeg ændre/udvider koden engang.
Avatar billede vagnk Juniormester
26. april 2016 - 19:34 #7
Tja, umiddelbart lyder det som en databasse der kunne trænge til en tur på arbejdsbænken. Lad mig råde dig til at søge professionel hjælp når det kommer på tale. At strukturere, normalisere og indexere en 'primitiv' DB er ikke for begyndere.

jeg tænkte på at lave en join til vare tabellen
Nu ved jeg jo ikke hvor store datamængder vi taler om, men sommetider kan det betale sig at indlæse varetabellen og lægge den i en intern tabel - specielt hvis du skal bruge den i flere sammenhænge. En query med både UNION og JOIN kan blive temmelig kompliceret, både for databasemotoren der skal bygge gennemløbet sammen og for fremtidige programmører hvis der skal rettes.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester