Avatar billede Slettet bruger
17. december 2012 - 12:45 Der er 14 kommentarer og
1 løsning

Top 10 på alle rækker fra ny kolonne

Hejsa!

Jeg prøver at køre en af disse 2 queries:

SELECT distinct
      a.RaptorCustomerKey
      ,sum(a.[Price]) as Price     
      ,b.ProductID
      ,(select distinct  b.CategoryID from raptordw.dbo.DimProduct) as CategoryID         
FROM [RaptorDW].[dbo].[FactPageView] as a       
        join RaptorDW.Dbo.DimProduct as b 
        on a.ProductKey = b.ProductKey         
where  a.raptorcustomerkey = 4 
group by  b.CategoryID, b.ProductID, a.RaptorCustomerKey, CategoryID

order by SUM(a.Price) desc 







select top 10
b.ProductID
,b.CategoryID
,sum(a.price) as Price
from RaptorDW.dbo.DimProduct b join RaptorDW.dbo.FactPageview a on a.ProductKey = b.ProductKey
where b.CategoryID = '9536'
group by b.ProductID, b.CategoryID
order by sum(a.price) desc




Det jeg gerne vil have ud er mine top 10 omsatte produkter på alle kategorier der findes.

Den nederste vil give mig top 10 omsatte produkter på en given kategori, men jeg kan ikke få den til at vise top 10 på alle kategorier.

Den øverste gør et eller andet, men den viser for mange produkter.

Hvordan vil i løse den?
Avatar billede Syska Mester
17. december 2012 - 14:14 #1
Hvad vil du have?

10 per kategori eller?
17. december 2012 - 14:17 #2
Det var ikke det du spurgte om, men det ser ud til at der er en en til en relation mellem tabellerne FactsPageView og DimProduct.  Det er ikke således, at der til hver række i FactsPageView hører flere rækker i DimProduct og heller ikke således at der til hver række i DimProduct hører flere rækker i FactsPageView.  Hvis det er korrekt at der er en en-til-en relation, så vil du sandsynligvis med fordel kunne føje de to tabeller sammen.  Det vil forenkle dit arbejde med tabellerne.

Men tilbage til dit spørgsmål:  Det står mig ikke helt klart hvad du ønsker at opnå.  Vil du for hver kategori have de ti mest omsatte produkter?  I så fald, hvis du  for eksempel har fem kategorier får du 50 resultater.  Eller vil du kun have de overalt ti mest omsatte produkter uanset kategori, hvor du for hvert af disse ti produkter får at vide hvilken kategori det hører til. I så fald vil der være kategorier der ikke får nogen produkter på listen.
Avatar billede Slettet bruger
17. december 2012 - 14:17 #3
Yep. 10 produkter per alle kategorier. Men de 10 produkter skal være de mest omsatte produkter
17. december 2012 - 14:17 #4
Nå, jeg er ikke den eneste der har det spørgsmål.
17. december 2012 - 14:19 #5
Vi bliver ved med at krydse hinanden.  Men altså for hver kategori vil du have ti produkter, nemlig de ti produkter der for den pågældende kategori er de mest omsatte.
Avatar billede Slettet bruger
17. december 2012 - 14:52 #6
Lige præcis! :D
17. december 2012 - 19:06 #7
Jeg beklager, men jeg har forsøgt uden at finde en løsning.  Jeg håber du får hjælpsomme indlæg fra anden kant.
Avatar billede Slettet bruger
17. december 2012 - 19:11 #8
Det i orden, jeg gør det bare via variable i ssis i stedet :) Men tak fordi du prøvede :)
Avatar billede arne_v Ekspert
18. december 2012 - 01:34 #9
Eksempel som finder TOP 2 i 4 kategorier:

1> CREATE TABLE product (
2>    id INTEGER NOT NULL,
3>    price DECIMAL(10,2) NOT NULL,
4>    category INTEGER NOT NULL,
5>    PRIMARY KEY (id)
6> )
7> GO
1>
2> CREATE TABLE sale (
3>    id INTEGER NOT NULL,
4>    product INTEGER NOT NULL,
5>    PRIMARY KEY(id)
6> )
7> GO
1>
2> INSERT INTO product VALUES(1, 10.0, 1)
3> GO
(1 row affected)
1> INSERT INTO product VALUES(2, 11.0, 2)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(3, 12.0, 2)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(4, 13.0, 3)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(5, 14.0, 3)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(6, 15.0, 3)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(7, 16.0, 4)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(8, 17.0, 4)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(9, 18.0, 4)
2> GO
(1 row affected)
1> INSERT INTO product VALUES(10, 19.0, 4)
2> GO
(1 row affected)
1>
2> INSERT INTO sale VALUES(1, 1)
3> GO
(1 row affected)
1> INSERT INTO sale VALUES(2, 2)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(3, 2)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(4, 3)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(5, 4)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(6, 4)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(7, 5)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(8, 6)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(9, 6)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(10, 7)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(11, 8)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(12, 8)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(13, 9)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(14, 10)
2> GO
(1 row affected)
1> INSERT INTO sale VALUES(15, 10)
2> GO
(1 row affected)
1>
2> SELECT product.id,product.category,SUM(product.price) totsal
3> FROM sale JOIN product ON sale.product=product.id
4> GROUP BY product.id,product.category
5> ORDER BY totsal DESC
6> GO
id          category    totsal
----------- ----------- ----------------------------------------
          10          4                                    38.00
          8          4                                    34.00
          6          3                                    30.00
          4          3                                    26.00
          2          2                                    22.00
          9          4                                    18.00
          7          4                                    16.00
          5          3                                    14.00
          3          2                                    12.00
          1          1                                    10.00

(10 rows affected)
1>
2> SELECT r.id,r.category,r.totsal
3> FROM (SELECT g.id,g.category,g.totsal,RANK() OVER (PARTITION BY g.category ORDER BY g.totsal DESC) catrank
4>      FROM (SELECT product.id,product.category,SUM(product.price) totsal
5>            FROM sale JOIN product ON sale.product=product.id
6>            GROUP BY product.id,product.category) g) r
7> WHERE r.catrank <= 2
8> ORDER BY r.category,r.totsal DESC
9> GO
id          category    totsal
----------- ----------- ----------------------------------------
          1          1                                    10.00
          2          2                                    22.00
          3          2                                    12.00
          6          3                                    30.00
          4          3                                    26.00
          10          4                                    38.00
          8          4                                    34.00

(7 rows affected)
1>
2> DROP TABLE sale
3> GO
1> DROP TABLE product
2> GO
Avatar billede Slettet bruger
18. december 2012 - 06:54 #10
Forudsætter den her ikke at du har produkter i begge eller er det nok med surrogatnøglen Productkey ?
Avatar billede Slettet bruger
18. december 2012 - 07:58 #11
Nevermind! Jeg fik det til at virke! Det er godt arbejde Arne! Kan du lige ligge et svar evt. -

Kan du evt fortælle mig hvordan jeg løser det her problem?

ProductID    CategoryID    totsal    catrank
977450425    64    455    4
6278200135    64    274    5
9548761129    64    232    6
977503401    64    0    7
6278400340    64    0    7
708500100    64    0    7
316080    64    0    7
708231114    64    0    7
708500501    64    0    7
781391462    64    0    7
977503402    64    0    7
976168415    64    0    7
6299107196    64    0    7
971860138    64    0    7
977445405    64    0    7

Den ranker productider med pris 0 som rank 7 på alle, og derved får jeg mere end en "top 10"
Avatar billede Slettet bruger
18. december 2012 - 10:11 #12
Du kan udskifte RANK() med ROW_NUMBER() for at få det der svarer til TOP(10).
Avatar billede Slettet bruger
18. december 2012 - 11:00 #13
Tak til begge ! :) Lig gerne et svar :)
18. december 2012 - 11:03 #14
Det var medlemmer såsom #9 jeg havde i tanker, da jeg bakkede ud med ønsket om at andre måtte kunne foreslå løsninger.
Avatar billede arne_v Ekspert
18. december 2012 - 14:56 #15
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester