---
title: "Komplext (?) procentproblem.."
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/148886-komplext-procentproblem"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "nakoz"
published: "2006-07-10T10:35:19.000Z"
updated: "2007-02-02T09:14:32.000Z"
replies: 17
views: 1139
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/148886-komplext-procentproblem"
---

# Komplext (?) procentproblem..

## #1 — nakoz, 2006-07-10T10:35Z

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

Permalänk: https://www.webforum.nu/p/148886

## #2 — yohpops, 2006-07-10T11:34Z

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

Hur ska det se ut?

Permalänk: https://www.webforum.nu/p/1838245

## #3 — nakoz, 2006-07-10T11:42Z

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.

Permalänk: https://www.webforum.nu/p/1838247

## #4 — yohpops, 2006-07-10T11:49Z

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.

Permalänk: https://www.webforum.nu/p/1838250

## #5 — yohpops, 2006-07-10T11:49Z

Vad är övrigt??

Permalänk: https://www.webforum.nu/p/1838251

## #6 — nakoz, 2006-07-10T15:42Z

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.

Permalänk: https://www.webforum.nu/p/1838309

## #7 — yohpops, 2006-07-11T05:53Z

```
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.

Permalänk: https://www.webforum.nu/p/1838458

## #8 — nakoz, 2006-07-11T14:04Z

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

Permalänk: https://www.webforum.nu/p/1841455

## #9 — nakoz, 2006-07-11T14:05Z

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

Permalänk: https://www.webforum.nu/p/1841456

## #10 — CatZ, 2006-07-12T00:15Z

/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.

Permalänk: https://www.webforum.nu/p/1841602

## #11 — yohpops, 2006-07-12T05:56Z

> **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%

Permalänk: https://www.webforum.nu/p/1841610

## #12 — nakoz, 2006-07-14T12:47Z

tusen tack. 
din kod fungerar klanderfritt.. =)

Permalänk: https://www.webforum.nu/p/1842255

## #13 — nakoz, 2006-07-14T16:24Z

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>"
```

Permalänk: https://www.webforum.nu/p/1842302

## #14 — nakoz, 2007-01-26T08:51Z

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!)

Permalänk: https://www.webforum.nu/p/1926745

## #15 — Peter S, 2007-01-26T23:34Z

```
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.

Permalänk: https://www.webforum.nu/p/1926974

## #16 — nakoz, 2007-01-30T15:41Z

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

Permalänk: https://www.webforum.nu/p/1927982

## #17 — Peter S, 2007-01-30T17:00Z

```
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
```

Permalänk: https://www.webforum.nu/p/1927999

## #18 — nakoz, 2007-02-02T09:14Z

Grymt, det fixade biffen. Tusen tack!

Permalänk: https://www.webforum.nu/p/1931720

---

Tråden på webben: https://www.webforum.nu/amne/asp/148886-komplext-procentproblem
