---
title: "Visa antalet artiklar som en viss leverantör är billigast på"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/147632-visa-antalet-artiklar-som-en-viss-leverantör-är-billigast-på"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "devotion"
published: "2006-06-01T22:42:16.000Z"
updated: "2006-06-04T22:59:49.000Z"
replies: 20
views: 792
page: 1
pages: 2
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/databaser-sql/147632-visa-antalet-artiklar-som-en-viss-leverantör-är-billigast-på"
---

# Visa antalet artiklar som en viss leverantör är billigast på

_Sida 1 av 2._

## #1 — devotion, 2006-06-01T22:42Z

Hmm, timmen är sen men jag gör ett fösök...  :)  

Jag har en databas med en massa artiklar i ca 300 000...

Fråga:

Kan man ställa en fråga till databasen som visar följande:

```
Storel är billigast på 156 000 artiklar
Solar är biligast på 58 000 artiklar
...
osv
```

Jag vet att jag inte presenterat några tabeller...
DBMS: SQL-server

Mvh
Henrik

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

## #2 — Brimba, 2006-06-01T22:58Z

hur ser kopplingen mellan produkt, leverantör och pris ut?

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

## #3 — devotion, 2006-06-02T06:05Z

Hej!

Min databasdesign ser ut så här:

<http://www.webforum.nu/showthread.php?p=1182604#post1182604>

Mvh
Henrik

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

## #4 — Brimba, 2006-06-02T06:51Z

Något sånt här du menar?

Notera dock att antalet produkter som är "billigast" kan vara fler än antalet produkter totalt sett. (Du ser exempel på det i min kod). Detta beror på att flera leverantörer kan ha samma pris på en produkt och då räknas båda som att de är billigast. Här kan du naturligtvis välja att göra på annat sätt, exempelivis inte räkna med att någon är billigast.

```
declare @Article table (AtricleNumber int, Name varchar(50))
insert into @Article
	select 1, 'artikel 1'
	union all 
	select 2, 'artikel 2'
	union all 
	select 3, 'artikel 3'
	union all 
	select 4, 'artikel 4'
	union all 
	select 4, 'artikel 5'

declare @Supplier table (SupplierId int, Name varchar(50))
insert into @Supplier
	select 1, 'Storel'
	union all 
	select 2, 'Solar'

declare @Price table (ArticleNumber int, SupplierId int, Price int)
insert into @Price
	select 1, 1, 100
	union all 
	select 2, 1, 500
	union all 
	select 1, 2, 200
	union all 
	select 2, 2, 800
	union all 
	select 3, 1, 1000
	union all 
	select 4, 2, 1000
	union all 
	select 5, 1, 1000
	union all 
	select 5, 2, 1000

select 
	count(*) NumberOfArticlesWithBestPrice, 
	SupplierId from @price t1 
where 
	price = (select min(price) from @price t2 where t1.articlenumber = t2.articlenumber) 
group by 
	supplierId
```

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

## #5 — devotion, 2006-06-02T07:16Z

Hej! :)  

Jag kanske har missat något, det är inte helt omöjligt... Har aldrig gjort så här avancerade saker med SQL innan...

Men resultatet blir enligt bifogad bild. Tycker inte det blir helt rätt...

Fört att lista alla artiklar ser min sql-fråga ut så här:

```
SELECT tblArticle.articlenumber, 
           tblArticle.articleName, 
           tblPrice.articlePrice, 
           tblPrice.articleCategoryNumber, 
           tblArticle.articleUnit,
           tblCategory.CategoryName, 
           tblCategory.categoryNumber, 
           tblDiscount.articleDiscount, 
           tblSupplier.SupplierName, 
           tblSupplier.SupplierId, 
CASE WHEN articleDiscount is null THEN 
          articlePrice ELSE 
          articlePrice*(1-([articleDiscount]*0.01)) END 
          AS articlePriceWithDiscount 
FROM tblArticle INNER JOIN 
	tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber INNER JOIN 
	tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId LEFT OUTER JOIN 
	tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND 
	tblPrice.articleSupplierId = tblDiscount.supplierId LEFT OUTER JOIN 
	tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND 
	tblPrice.articleCategoryNumber = tblCategory.categoryNumber 
ORDER BY articlePriceWithDiscount
```

Mvh
Henrik

Bilagor:

- [bestPrices.png](https://www.webforum.nu/a/10960.png)

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

## #6 — Brimba, 2006-06-02T08:38Z

Varför tycker du inte att det blir rätt?
Du har supplierId och kan därmed joina mot tabellen supplier om du vill få fram namnet på leverantören. 

> Storel är billigast på 156 000 artiklar
> Solar är biligast på 58 000 artiklar
> ...

Här tycker jag att databasen skall leverera två saker.. Namnet på leverantören och antalet artiklar som den leverantören är billigast på, och det gör frågan.

Såhär skulle det kunna se ut om man joinar mot supplier samt sorterar efter den som är billigast på flest artiklar

```
select 
	s.Name,
	count(*) NumberOfArticlesWithBestPrice
from 
	@price p 
	inner join @Supplier s on p.supplierId = s.supplierId
where 
	price = (select min(price) from @price where p.articlenumber = articlenumber) 
group by 
	s.Name
order by 
	count(*) desc
```

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

## #7 — devotion, 2006-06-02T10:20Z

Hej! :) 

Jo, det blir ju rätt. Men det är lite för få artiklar tycker jag... Fattas det inte något här?

Är inte de värdena du skrivit "hårdkodade".. Du får ha överseende, men jag är inte så bra på detta..  :)  

Med den sista biten kod kom ju leverantörs namnet med....(y)  

Mvh
Henrik

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

## #8 — Brimba, 2006-06-02T11:15Z

Ok. Det du får göra är att byta ut mina tabellnamn mot de som du har i din databas. 

Det borde troligtvis bli ungefär såhär.

```
select 
	s.Name,
	count(*) NumberOfArticlesWithBestPrice
from 
	tblPrice p 
	inner join tblSupplier s on p.articleSupplierId = s.supplierId
where 
	price = (select min(price) from tblPrice where p.articlenumber = articlenumber) 
group by 
	s.Name
order by 
	count(*) desc
```

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

## #9 — devotion, 2006-06-02T21:01Z

testade att att provköra, men fick följande fel..

```
Msg 207, Level 16, State 1, Line 45
Ogiltigt kolumnnamn, 'price'.
Msg 207, Level 16, State 1, Line 45
Ogiltigt kolumnnamn, 'price'.
Msg 207, Level 16, State 1, Line 47
Ogiltigt kolumnnamn, 'Name'.
Msg 207, Level 16, State 1, Line 39
Ogiltigt kolumnnamn, 'Name'.
```

Mvh
Henrik

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

## #10 — mozilla, 2006-06-02T21:16Z

> **Brimba skrev:**
>
> Ok. Det **du** får göra är att **byta ut** mina tabellnamn mot de som du har i **din databas**.

Du har inte vad jag kan se något tabellnamn/fält som heter price eller Name? Utan i ditt fall heter de väl **articlePrice** och **supplierName**?

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

## #11 — devotion, 2006-06-02T21:28Z

Som sagt, jag är inte så bra på så avancerade SQL-frågor...

Men nu testade jag följande:

```
select 
	s.supplierName,
	count(*) NumberOfArticlesWithBestPrice
from 
	tblPrice p 
	inner join tblSupplier s on p.articleSupplierId = s.supplierId
where 
	articlePrice = (select min(articlePrice) from tblPrice where p.articlenumber = articlenumber) 
group by 
	s.supplierName
order by 
	count(*) desc
```

och det verkar fungera... se bild...

Men om jag vill ha med pris med rabatt, enligt min SQL-sats, hur gör jag då?

Mvh
Henrik

Bilagor:

- [resultat.png](https://www.webforum.nu/a/10966.png)

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

## #12 — Brimba, 2006-06-03T20:57Z

Men det påverkar väl inte slutresultatet eftersom rabatten ligger på artikeln och inte på leverantören?

Men det borde bli något i stil med detta:

```
select 
	s.supplierName,
	count(*) NumberOfArticlesWithBestPrice
from 
	tblPrice p 
	inner join tblSupplier s on p.articleSupplierId = s.supplierId
where 
	CASE WHEN articleDiscount is null THEN 
          articlePrice ELSE 
          articlePrice*(1-([articleDiscount]*0.01)) END = (select min(CASE WHEN articleDiscount is null THEN 
          articlePrice ELSE 
          articlePrice*(1-([articleDiscount]*0.01)) END) from tblPrice where p.articlenumber = articlenumber) 
group by 
	s.supplierName
order by 
	count(*) desc
```

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

## #13 — devotion, 2006-06-03T21:03Z

Ok...

rabatten ligger i tblDiscount

Men måste inte tblDiscount joinas också?

Mvh
Henrik

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

## #14 — @nders, 2006-06-04T06:01Z

> Men måste inte tblDiscount joinas också?

Jo, den måste in i joinen. Men det fixar du. :)

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

## #15 — devotion, 2006-06-04T06:16Z

okidoki

:)

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

## #16 — devotion, 2006-06-04T20:00Z

Nähä.. som vanligt... :( 

På något sätt måste väl denna raden in i koden.. men, jag får inte till det...

```
LEFT OUTER JOIN 
	tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND 
	tblPrice.articleSupplierId = tblDiscount.supplierId
```

hela sql-frågan för att visa alla artiklar ser ut så här:

```
SELECT tblArticle.articlenumber, 
           tblArticle.articleName, 
           tblPrice.articlePrice, 
           tblPrice.articleCategoryNumber, 
           tblArticle.articleUnit,
           tblCategory.CategoryName, 
           tblCategory.categoryNumber, 
           tblDiscount.articleDiscount, 
           tblSupplier.SupplierName, 
           tblSupplier.SupplierId, 
CASE WHEN articleDiscount is null THEN 
          articlePrice ELSE 
          articlePrice*(1-([articleDiscount]*0.01)) END 
          AS articlePriceWithDiscount 
FROM tblArticle INNER JOIN 
	tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber INNER JOIN 
	tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId LEFT OUTER JOIN 
	tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND 
	tblPrice.articleSupplierId = tblDiscount.supplierId LEFT OUTER JOIN 
	tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND 
	tblPrice.articleCategoryNumber = tblCategory.categoryNumber 
ORDER BY articlePriceWithDiscount
```

Mvh Henrik

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

## #17 — Brimba, 2006-06-04T22:11Z

Prova detta:

```
select 
	s.supplierName,
	count(*) NumberOfArticlesWithBestPrice
from 
	tblPrice p 
	inner join tblSupplier s on p.articleSupplierId = s.supplierId
	left join tblDiscount d ON p.articleCategoryNumber = d.categoryNumber AND p.articleSupplierId = d.supplierId
where 
	CASE WHEN articleDiscount is null THEN 
          p.articlePrice ELSE 
          p.articlePrice*(1-([d.articleDiscount]*0.01)) END = (select min(CASE WHEN articleDiscount is null THEN 
          articlePrice ELSE 
          articlePrice*(1-([articleDiscount]*0.01)) END) from tblPrice left join tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId where tblPrice.articlenumber = articlenumber) 
group by 
	s.supplierName
order by 
	count(*) desc
```

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

## #18 — devotion, 2006-06-04T22:16Z

Hej Brimba!

Tack för att du tar dig tid...

Men nu fick jag detta:

```
Msg 207, Level 16, State 1, Line 11
Ogiltigt kolumnnamn, 'd.articleDiscount'.
```

Mvh
Henrik

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

## #19 — Brimba, 2006-06-04T22:19Z

Sa du inte att articleDiscount låg i tblDiscount?

Hur som helst, prova detta:

```
select 
	s.supplierName,
	count(*) NumberOfArticlesWithBestPrice
from 
	tblPrice p 
	inner join tblSupplier s on p.articleSupplierId = s.supplierId
	left join tblDiscount d ON p.articleCategoryNumber = d.categoryNumber AND p.articleSupplierId = d.supplierId
where 
	CASE WHEN articleDiscount is null THEN 
          p.articlePrice ELSE 
          p.articlePrice*(1-([articleDiscount]*0.01)) END = (select min(CASE WHEN articleDiscount is null THEN 
          articlePrice ELSE 
          articlePrice*(1-([articleDiscount]*0.01)) END) from tblPrice left join tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId where tblPrice.articlenumber = articlenumber) 
group by 
	s.supplierName
order by 
	count(*) desc
```

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

## #20 — devotion, 2006-06-04T22:31Z

:)  

Det fungerade ju bättre.. :) 

Men hur "vet man" att den räknar rätt?

Jag tycker det blir lite lite, med tanke på att databasen innehåller nästan 400 000 artiklar?

sen är ju 2 av leverantörerna inte med... Någon leverantör måste ju vara billagast på något..

Bifogar bild på resultatet

Jämför med:
<http://www.webforum.nu/attachment.php?attachmentid=10966>
Där det inte tas hänsyn till rabatten...

Mvh
Henrik

Bilagor:

- [resultat.png](https://www.webforum.nu/a/10983.png)

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/147632-visa-antalet-artiklar-som-en-viss-leverantör-är-billigast-på  
Nästa sida: https://www.webforum.nu/amne/databaser-sql/147632-visa-antalet-artiklar-som-en-viss-leverantör-är-billigast-på/page2.md
