webForumDet fria alternativet

Komplext (?) procentproblem..

17 svar · 1 129 visningar · startad av nakoz

nakozMedlem sedan dec. 1999653 inlägg
#1

Hej.

Jag håller på med en sida där man kan välja olika produkter, som i sin tur tillhör en kategori, till ett "paket" med ca: 100 olika produkter.

Databasen ser - väldigt förenklad - ut såhär:

produkt
pID
pNamn
pTillKategori

kategori
kID
kNamn

paket
paID
paProduktID

Jag vill nu plocka ut längst ner på paket-sidan hur många procent ur respektive grupp som paketet täcker upp. Den ska även "noll-lista" kategorierna, eftersom detta är ett verktyg då de sätter ihop paketen att de ser att fördelningen mellan respektive kategori är jämn samt att de inte glömt någon kategori.

Jag har sedan tidigare en variabel som heter antalProd som jag sen kan räkna ut procenten med, men på något sätt måste jag ju göra en count på respektive kategori, där en produkt finns representerad i paketet.

Lite vägledning vore toppen..

Mvh,

Linus

yohpopsMedlem sedan feb. 20011 198 inlägg
#2

Vad exakt vill du ha hjälp med?
Är det en sql-fråga eller är det ASP-kod?

Hur ska det se ut?

nakozMedlem sedan dec. 1999653 inlägg
#3

Ja, endera en Join eller loopar som plockar fram det jag behöver.
Men koden i sig behövs egentligen inte, utan mer HUR jag ska gå till väga.

Jag vill lista det såhär på en sida:
Kategori1: 12% - Kategori2: 25% - Kategori3: 43% - Kategori4: 10% - Övrigt: 10%

Alltså den loopar igenom kategori-namnen samt räknar ut en procent för resp. kategori.

yohpopsMedlem sedan feb. 20011 198 inlägg
#4

Du får skriva en sql-fråga med två subquerys.
En som räknar antal produkter per kategori i paketet och en som räknar det totala antalet produkter i paketet.
Dividera dessa och multiplicera med 100.

yohpopsMedlem sedan feb. 20011 198 inlägg
#5

Vad är övrigt??

nakozMedlem sedan dec. 1999653 inlägg
#6

Det är den "första" queryn som jag undrar över, hur skulle den ex. kunna se ut?
Totalen använder jag på ett annat ställe som "antalProd" som jag nämnde ovan.

Alltså, hur man räknar antal produkter per kategori. För vilken kategori resp. produkt tillhör hittar man ju inte i paket-tabellen. Utan på varje produkt måste jag ju gå in och kolla vilken kategori den tillhör.

Övrigt innebär produkter som inte blivit placerade i någon kategori.

yohpopsMedlem sedan feb. 20011 198 inlägg
#7
select kID, kNamn,
(select count(*) from produkt where pID in(select distinct paProduktID from paket 
where paID=1 and paProduktID in(select distinct pID from produkt where pTillKategori=k1.kID) ) and pTillKategori=k1.kID),
(select count(*) from produkt where pID in(select distinct paProduktID from paket where paID=1))
from kategori k1

För att Övrigt ska fungera måste det finnas begränsningar.
Tex att ett paket får/måste innehålla 5 kategorier eller produkter.
Eller minst en produkt från varje kategori.

Annars om man lägger in en produkt i ett paket blir ju den kategorien 100% av paketet.

nakozMedlem sedan dec. 1999653 inlägg
#8

Annars kan man vara lite bekväm å räkna ut de andra procent-satserna å sen ta 100-resten å få ut övrigt =)

nakozMedlem sedan dec. 1999653 inlägg
#9

Ska prova din sql-sats nu, ser direkt att de inte är nåt jag skulle kommit på =)

CatZMedlem sedan jan. 20022 440 inlägg
#10

/Red

Ursäkta klistrade in fel länk! :D Den här skulle det va: http://sqlcourse2.com/intro2.html

w3schools rockar men är väldigt grundläggande.

yohpopsMedlem sedan feb. 20011 198 inlägg
#11

nakoz skrev:

Annars kan man vara lite bekväm å räkna ut de andra procent-satserna å sen ta 100-resten å få ut övrigt =)

Nja, det funkar inte.
De kategorier som ligger i paketet utgör ju 100 procent av de kategorier som ligger i paketet, det kommer du aldrig ifrån, oavsett om du lägger en produkt eller oändligt med produkter i paketet, så länge du inte har begränsningar.

Ex 1.
Paket 1 innehåller kategorierna:
Bollar med 3 produkter = 30%
Skor med 2 produkter = 20%
Byxor med 5 produkter = 50%
Totalt 10 produkter = 100%

nakozMedlem sedan dec. 1999653 inlägg
#12

tusen tack.
din kod fungerar klanderfritt.. =)

nakozMedlem sedan dec. 1999653 inlägg
#13

Kan ju passa på att posta mitt slutliga resultat, de kanske hjälper någon.

SQL = "SELECT pgID, pgNamn, (SELECT Count(*) FROM produkter WHERE pID IN(SELECT DISTINCT plProdukt FROM plContent WHERE plTillPlanogram=" & Session("tillplan") & " AND plProdukt IN(SELECT DISTINCT pID FROM produkter WHERE pTillGrupp=k1.pgID) ) AND pTillGrupp=k1.pgID) AS antal, (SELECT Count(*) FROM produkter WHERE pID IN(SELECT DISTINCT plProdukt FROM plContent WHERE plTillPlanogram=" & Session("tillplan") & ")) AS total FROM pgrupp AS k1 GROUP BY k1.pgID, k1.pgNamn ORDER BY 3 DESC"
Set rs = cn.Execute(SQL)

Response.Write "<table cellpadding='0' cellspacing='0' border='0' width='220'>"

i = 0
Do Until rs.EOF
	iProc = Round((rs("antal") / rs("total")) * 100,1)
	
	If iProc <> 0 Then

	If i Mod 2 = 0 Then bgcol = "#F4F4F4" Else bgcol = "white"
	i = i + 1
	Response.Write "<tr bgcolor=""" & bgcol & """ height=""14"">"
	Response.Write "<td> <div class='tdsmallny'>" & rs("pgNamn") & "</div> </td>"
	Response.Write "<td> <div class='tdsmallny'><b>" & iProc & "</b>%</div> </td>"
	Response.Write "</tr>"

	End If

	rs.MoveNext
Loop

Response.Write "</table>"
nakozMedlem sedan dec. 1999653 inlägg
#14

Ja, jag hoppades att koden skulle hjälpa någon, men ändå så får jag inte ihop det när jag ska skriva om den för ett annat användningsområde. :)

Liknande problem dock, men en tabell mindre? :r

produkt
pID
pNamn
pTillverkare

paket
paID
paProduktID

Nu vill jag för respektive paket få ut hur många procent som är gjort av varje tillverkare. pTillverkare är en sträng.

Ex:
Volvo 40%
Hitachi 25%
SonyEricsson 20%
Dell 15%

Jag vet att jag borde byggt denna tabellen på samma sätt som föregående. Men det blev inte så och nu är det detta jag har att jobba med.

Jag tycker jag har provat att modifiera yohops SQL-fråga på alla jädra sätt jag kan komma på, men inte rätt sätt uppenbarligen.

Frågan:
Hur ska min SQL-sats se ut (och gärna en rads förklaring så jag klarar detta på egen hand nästa gång!)

Peter SMedlem sedan dec. 20025 483 inlägg
#15
select pa.paid
     , pr.ptillverkare
     , 100 * count(*)
     / ( select count(*)
           from paket
          group
             by paid
         having paid = pa.paid) as percent
  from paket pa
inner
  join produkt pr
    on pa.paproduktid = pr.pid
group
    by pa.paid
     , pr.ptillverkare
order
    by 1
     , 3 desc

Tanken är alltså att räkna ut kvoten av antalet produkter från varje tillverkare per paket, och det totala antalet produkter per paket. För att åstadkomma det behöver du gruppera på paket-id och tillverkare. Från dessa grupper får du enkelt ut antalet produkter för varje enskild tillverkare, vilket du därefter behöver dividera med paketets totala antal produkter.

Typ.

nakozMedlem sedan dec. 1999653 inlägg
#16

Jag får inte ihop det, kanske för att jag inte beskrev frågan tillräckligt tydligt. :)

Jag vill nämligen hämta leverantörsfördelningen för ett specifikt paket. Dvs.
i tabellen paket har jag ett fält som heter paTillPaket och ska matchas mot ett värde som kommer i en session/variabel.

Jag tycker jag har försökt alla möjliga kombinationer att få in en WHERE/INNER JOIN xxx ON paTillPaket = " & session("mittID") & ".

Som bäst fick jag ut ~3000 produkter på en lista där alla angavs vara 100%... :)
Lite krävande för databasen (access FTW!). I ett "paket" finns det som mest ~50 produkter där jag vill gruppera per leverantör och procent. "Percent" var även ett låst uttryck i access, men det upptäckte jag tidigt.

Någon? :o

Peter SMedlem sedan dec. 20025 483 inlägg
#17
select pr.ptillverkare
     , 100 * count(*)
     / ( select count(*)
           from paket
          where patillpaket = session("mittid") ) as q
  from paket pa
inner
  join produkt pr
    on pa.paproduktid = pr.pid
 where pa.patillpaket = session("mittid")
group
    by pr.ptillverkare
order
    by 2 desc
nakozMedlem sedan dec. 1999653 inlägg
#18

Grymt, det fixade biffen. Tusen tack!

134 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)