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
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
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
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
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å?
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
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
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
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