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.
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.
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.
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.
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%
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>"
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.
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.
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