webForumDet fria alternativet

Distinct "trubbel"

5 svar · 2 379 visningar · startad av JAreMANNEN

JAreMANNENMedlem sedan aug. 20002 272 inlägg
#1

Halloj!

Har sökt på forumet och provat lite men just nu har jag fått fnatt på alla distinct och group by :OO

Följande problem har jag..
Ska lista produkter ur en produkttabell.
Varje produkt finns med 3 olika ID i DB'n, anledningen är att varje storlek har ett eget ID.

såhär kan det se ut...
(rödmarkerat är det som skiljer (storleksnummer)

tblProdukter (visar inte hela tabellstrukturen)
ID | Artnr | Pris | StilID
11020049002 | 303-1 | 330 | 25
11020049004 | 303-1 | 330 | 25
11020049006 | 303-1 | 330 | 25

När jag nu listar produkterna med distinct så visas varje produkt x 3, å det funkar ju inget vidare...
Därför kör jag just nu en lite kringgående variant:
distinct(Left(ID, 9). Tittar man i db-tabellen ovan så förstår du varför...
Och eftersom jag kör distinct(Left(ID, 9) så kan jag inte sortera efter en speciell stil, för den kolumnen finns inte med i SELECT.

Såhär gör jag just nu:

SQL = " SELECT DISTINCT(Left(ID, 9)) FROM tblProdukter WHERE Aktiverad = 1 AND Len(ID) > 1 "
Set rs = Databas.Execute(SQL)

arrGetProd = rs.Getrows()
rs.Close : Set rs = Nothing

If IsArray(arrGetProd) Then

  For i = 0 To UBound(arrGetProd,2)

    intProdID = arrGetProd(0,i)
		
    SQL = " SELECT * FROM tblProdukter WHERE Left(ID, 9) = "& intProdID
    Set rs2 = Databas.Execute(SQL)
		
    strArtNr = rs2("ArtNr")
    intProdID = rs2("ID")
    intPris = rs2("Pris")
		
    SQL = " SELECT * FROM tblProduktInfo WHERE ProdID = "& intProdID &" AND SprakID = 1 "
    Set rs3= Databas.Execute(SQL)
		
    If rs3.Eof Then
      strText = ("Produkten saknar informationstext.")
    Else
      strText = rs3("Info")
    End If
    rs3.Close

    [b]'LISTAR PRODUKT[/b]

  Next
  rs2.Close
End If

Känns lite fel att hämta info ur samma tabell 2 ggr...
Att hämta produktinfo kan göras som jag gör nu om det inte går att joina ihop "allt i ett".

Alla svar och förslag uppskattas!

mvh :)

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Kan du beskriva vilka tabeller du har, ge lite exempel på datainnehåll coh visa vilket resultat du vill ha.

Det känns som om din datamodell inte är riktigt rätt.

yohpopsMedlem sedan feb. 20011 198 inlägg
#3

Varför finns varje produkt med tre gånger om alla produkter finns i tre storlekar?

Varje produkt finns med 3 olika ID i DB'n, anledningen är att varje storlek har ett eget ID.

Engine^Medlem sedan dec. 20003 887 inlägg
#4

Engine^ rekommenderar:

Splitta ID-kolumnen så att storleken inte har någon betydelse (öhh... där ser man ;)) för den produkten. Skapa istället en tabell som innehåller produktens olika storlekar.

JAreMANNENMedlem sedan aug. 20002 272 inlägg
#5

OK, ger mig på ett lite mer beskrivande inlägg :)

Att datamodellen ser ut som den gör beror på att artikeldelen i vårt affärssystem som har hand om logistik m.m bygger på samma modell. Uppdatering i DB'n sker mha en genererad txt-fil från affärssystemet. Visst, man kan göra om den txt-filen som man vill med formatmallar och Bulk Insert, men det har jag inte haft tid att sätta mig in i. Använder MS SQL Servers inbyggda DTS och "Data Transform Task".

Jag vill altså (om det går) "slå ihop"...

SQL = " SELECT DISTINCT(Left(ID, 9)) FROM tblProdukter WHERE Aktiverad = 1 AND Len(ID) > 1 "
Set rs = Databas.Execute(SQL)

...med koden som ligger i For-loopen... (sen mitt första inlägg i dena tråden)

SQL = " SELECT * FROM tblProdukter WHERE Left(ID, 9) = "& intProdID
Set rs2 = Databas.Execute(SQL)
		
strArtNr = rs2("ArtNr")
intProdID = rs2("ID")
intPris = rs2("Pris")

Jag får ju bara ut (givetvis) Left(ID, 9) från den första SQL-strängen, så därför måste jag ju hämta ut från tblProdukter IGEN inne i loopen. Å sen kan jag ju inte sortera "huvudsökningen heller". Det just detta som frågan handlar om...
Känns lite overkill att hämta 2ggr från samma tabell.
Försökte nu senast med:

SELECT * FROM tblProdukter
WHERE ID IN
(SELECT DISTINCT(Left(ID, 9)) FROM tblProdukter)

Men det gav inget resultet öht..

Hoppas att ni förstår lite bättre nu..

mvh

yohpops skrev:

Varför finns varje produkt med tre gånger om alla produkter finns i tre storlekar?

Varje produkt finns med 3 olika ID i DB'n, anledningen är att varje storlek har ett eget ID.

ALLA produkter har inte 3 storlekar.
Vissa har bara en, andra har två...

00 = One Size
02 = Small
03 = S/M
04 = Medium
05 = M/L
06 = Large

JAreMANNENMedlem sedan aug. 20002 272 inlägg
#6

Löste det som jag ville ha det med följande

SELECT Left(ID, 9), min(artnr) AS ArtNr, min(storlekid) AS StorleksID, min(stilid) AS StilID FROM tblProdukter
GROUP BY Left(ID, 9) ORDER BY StilID DESC
125 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)