Avatar billede fuxi Nybegynder
26. marts 2003 - 13:08 Der er 17 kommentarer og
4 løsninger

Tricky sql

Jeg sidder med en tricky select statement. Som jeg ikke kan få til at virke

Jeg har følgende senarie:
- En tabel hvor i der er en række produkter
- Nogle af produkterne er ens med undtagelse af produktID
- Se et eksempel på en tabelsindhold

| PRODUKTNAVN | PRODUKTID | LAND | PRIS |
| Handsker    | 1        | DK  | 1000 |
| Handsker    | 2        | DK  | 1000 |
| Handsker    | 3        | DK  | 1000 |
| Hue        | 4        | DK  | 1200 |

- Jeg vil gerne have lavet en select statement som sørger for at mit udtræk kommer til at se ud som nedenstående

| PRODUKTNAVN | PRODUKTID | LAND | PRIS |
| Handsker    | 1        | DK  | 1000 |
| Hue        | 4        | DK  | 1200 |

Jeg håber det kan løses rent sql mæssigt ellers må jeg kode mig ud af det.
Avatar billede ellebaek Nybegynder
26. marts 2003 - 13:26 #1
jeg er ikke 100% sikker på jeg forstår havd det er du vil...

Men jeg forstår det sådan at du vil have et produkt trukket ud der har de kriterier...
Hvorfor tjekker du ikke bare for om id er det samme i din select ??
"select * from tabel where produktid = " & request("produktid")
Hvis det er tekst så:
"select * from tabel where produktid = '" & request("produktid") & "'"
Avatar billede oasen Nybegynder
26. marts 2003 - 13:28 #2
Select Produktnavn, ProduktID, Land, Pris From Tabel Group By Produktnavn
Avatar billede oasen Nybegynder
26. marts 2003 - 13:29 #3
Eller:

Select Distinct Produktnavn, ProduktID, Land, Pris From Tabel
Avatar billede fuxi Nybegynder
26. marts 2003 - 13:36 #4
>> Ellebaek
Jeg kan ikke gøre som du nævner da jeg lige netop vil lave en select statement hvor jeg vælger en række forskellige elementer ud. Det som du foreslår et at jeg laver en udvælgelse direkte på ProduktID.
Avatar billede fuxi Nybegynder
26. marts 2003 - 13:38 #5
>> Oasen
Hvis jeg gør som du foreslår, så får jeg jo ikke splittet mine produkterIDer fra. Der er forskellige produktIDer til hvert produkt, så derfor vil jeg får samme resultat som hvis jeg slet ikke havde brugt distinct
Avatar billede fuxi Nybegynder
26. marts 2003 - 13:42 #6
Det der er problemet er at jeg f.eks. skriver følgende:
SELECT DISTINCT produktnavn, land, pris, produktid FROM produkt

Så får jeg følgende:
| PRODUKTNAVN | PRODUKTID | LAND | PRIS |
| Handsker    | 1        | DK  | 1000 |
| Handsker    | 2        | DK  | 1000 |
| Handsker    | 3        | DK  | 1000 |
| Hue        | 4        | DK  | 1200 |

Skriver jeg istedet:
SELECT DISTINCT produktnavn, land, pris FROM produkt

Så får jeg følgende:
| PRODUKTNAVN | LAND | PRIS |
| Handsker    | DK  | 1000 |
| Hue        | DK  | 1200 |

Hvilket jo er meget tæt på det rigtige resultat, der mangler bare lige ProduktID, som jeg skal have med ud...
Avatar billede oasen Nybegynder
26. marts 2003 - 13:45 #7
Hvis du grupperer efter produktnavnet, skulle du gerne få det rigtige output. Har du prøvet?
Avatar billede carpediem Nybegynder
26. marts 2003 - 14:02 #8
Hvilket produktID skal med ud? det mindste, det højeste, dem alle? Hvad er det du vil?
Avatar billede carpediem Nybegynder
26. marts 2003 - 14:04 #9
I dit eksempel er det jo det mindste, så prøv lige:
Select Distinct Produktnavn, MIN(ProduktID) AS ProduktID, Land, Pris From Tabel
Avatar billede carpediem Nybegynder
26. marts 2003 - 14:09 #10
Hovsa, det kommer vist ikke til at virke. Der mangler lidt groub by.

Select Distinct Produktnavn, MIN(ProduktID) AS ProduktID, Land, Pris From Tabel
GROUP BY Produktnavn, Land, Pris
Avatar billede fuxi Nybegynder
26. marts 2003 - 14:32 #11
>> Oasen
Yep jeg har prøvet, problemet med Group By er at man ikke bare kan lave group by på et felt hvis du skal have 4 ud. Du bliver nød til at lave group by på alle felter.
Avatar billede fuxi Nybegynder
26. marts 2003 - 14:33 #12
Jeg må jo nok også lige erkende at tingene ikke er så simple som i eksemplet
Det jeg  sidder med er noget mere kompleks, men jeg har lavet eksemplet for at simplificere mit problem
Avatar billede fuxi Nybegynder
26. marts 2003 - 14:36 #13
>> carpediem
Problemet med den sætning du fyrer af her:
Select Distinct Produktnavn, MIN(ProduktID) AS ProduktID, Land, Pris From Tabel
GROUP BY Produktnavn, Land, Pris

Er at du jo godt nok laver en min(ProduktID) men det er jo Min på alle produktIDer. Ergo bliver resultatet følgende:
| PRODUKTNAVN | PRODUKTID | LAND | PRIS |
| Handsker    | 1        | DK  | 1000 |
| Hue        | 1        | DK  | 1200 |
Avatar billede carpediem Nybegynder
26. marts 2003 - 14:40 #14
Det skulle den nu ikke gerne. Har du forsøgt?
Avatar billede oasen Nybegynder
26. marts 2003 - 14:41 #15
fuxi ---> Ja, det er jeg klar over. Der mangler et par feltnavne i strengen, jeg gav dig.
Men hvad sker der, hvis du eksekverer denne?

Select Produktnavn, ProduktID, Land, Pris From Tabel Group By Produktnavn, ProduktID, Land, Pris Order By ProduktID
Avatar billede carpediem Nybegynder
26. marts 2003 - 14:45 #16
Jeg har netop lige forsøgt, at lave et eksempel magen til dit. Og følgende streng giver det rigtige resultat:
SELECT DISTINCT Produktnavn, MIN(ProduktID) AS ProduktID, Land, Pris
FROM test
GROUP BY Produktnavn, Land, Pris
Avatar billede arnvig Nybegynder
26. marts 2003 - 14:54 #17
Det kan løses temmelig nemt med en subselect.
Men det er ikke alle DBMS'er som understøtter dette.
Avatar billede fuxi Nybegynder
26. marts 2003 - 14:59 #18
Hello jeg er glad for jeres ihærdighed :O)
Men det virker altså ikke helt endnu, jeg får stadig dubletter frem
Avatar billede fuxi Nybegynder
26. marts 2003 - 14:59 #19
Her er den kode jeg har prøvet i det virkelige live:

SELECT   
    P.title, P.DESTINATION_CODE,
    TO_CHAR(P.modified_time,'dd-mm-rrrr'),
    TO_CHAR(P.PUBLISH_START_DATE,'dd-mm-rrrr'),
    TO_CHAR(P.PUBLISH_END_DATE,'dd-mm-rrrr'),
    TO_CHAR(P.valid_from,'dd-mm-rrrr'),
    TO_CHAR(P.valid_to,'dd-mm-rrrr'),
    P.duration,
    min(p.product_id) as mProductID,
    P.price_normal,
    DK,
    P.VALID_FROM   
FROM
    product P,
    Geography G
WHERE
    P.SUPPLIER_ID = 2278     
    AND P.DESTINATION_CODE = G.TM_CODE
    AND p.IS_HISTORY = 0 
    AND p.MANAGEMENT_SOURCE = 'MANUAL'
    AND P.CONCEPT_ID=2 
    AND P.CONCEPT_ID=P.SUPPLIER_CONCEPT 
    AND P.IS_ON_AUCTION=0
    AND P.IS_APPROVED=1 
    AND p.IS_PRICE_REDUCED = 0   
    AND  sysdate  >= P.PUBLISH_START_DATE 
    AND  sysdate  <= P.PUBLISH_END_DATE
    GROUP BY p.title, P.DESTINATION_CODE,P.modified_time,P.PUBLISH_START_DATE,P.PUBLISH_END_DATE,P.valid_from,P.valid_to,P.duration,P.price_normal,DK,P.VALID_FROM
Avatar billede fuxi Nybegynder
26. marts 2003 - 15:00 #20
Sådan lige for jeres info er der en Oracle 8i jeg arbejder med
Avatar billede fuxi Nybegynder
31. marts 2003 - 11:23 #21
Jeg har selv lavet en løsning på problemet. Jeg løste det med subselect som amvig nævnte...
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
Kategori
Kurser inden for grundlæggende programmering

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