Avatar billede simsen Mester
21. november 2009 - 16:22 Der er 7 kommentarer og
1 løsning

Select distinct virker ikke efter hensigten

Hej,

Jeg forsøger mig med en select Distinct på viste where clause.

Det jeg har brug for, er at den kun tager én truckBrandName med. Men lige nu tager den begge med, der er i tabellen.

Altså der kan være mange rækker med samme truckBrandName men den skal kun tage den med, der har den højeste movieCountSeen for et mærke.

Hvordan gør jeg det?

SELECT  DISTINCT  dbo.Movies.moviePId, dbo.Movies.movieName, dbo.Movies.movieLink, dbo.Movies.movieImage, dbo.Movies.movieDescriptionShort,
                      dbo.Movies.movieDescriptionLong, dbo.Movies.movieKeywords, dbo.Movies.movieCountSeen, dbo.Movies.movieDateAdded, dbo.Movies.truckBrandFId,
                      dbo.TruckBrands.truckBrandName
FROM        dbo.Movies INNER JOIN
                      dbo.TruckBrands ON dbo.Movies.truckBrandFId = dbo.TruckBrands.truckBrandPId

mvh
simsen :-)
Avatar billede janus_007 Nybegynder
21. november 2009 - 16:43 #1
hmm...

SELECT  dbo.Movies.moviePId, dbo.Movies.movieName, dbo.Movies.movieLink, dbo.Movies.movieImage, dbo.Movies.movieDescriptionShort,
                      dbo.Movies.movieDescriptionLong, dbo.Movies.movieKeywords, dbo.Movies.movieCountSeen, dbo.Movies.movieDateAdded, dbo.Movies.truckBrandFId,
                      dbo.TruckBrands.truckBrandName
FROM        dbo.Movies INNER JOIN
(select top 1 truckBrandName, truckBrandId
    from dbo.TruckBrands
    group by truckBrandName, truckBrandId
    order by count(*) desc) as t1
ON dbo.Movies.truckBrandFId = t1.truckBrandPId

Eller som cross apply:
SELECT  dbo.Movies.moviePId, dbo.Movies.movieName, dbo.Movies.movieLink, dbo.Movies.movieImage, dbo.Movies.movieDescriptionShort,
                      dbo.Movies.movieDescriptionLong, dbo.Movies.movieKeywords, dbo.Movies.movieCountSeen, dbo.Movies.movieDateAdded, dbo.Movies.truckBrandFId,
                      tbn.truckBrandName
FROM        dbo.Movies t
cross apply(
          select top 1 truckBrandName
            where dbo.TruckBrands.truckBrandPId = t.truckBrandFId
group by truckBrandName
order by count(*) desc) as tbn
Avatar billede simsen Mester
21. november 2009 - 19:42 #2
Hej Janus

Tak for dit forsøg. Men ikke helt det jeg søger. Det du giver mig er kun én fra TruckBrands tabellen og så giver mig de 2 rækker, der har den ene fra Movies tabellen.

Det jeg har brug for er;

Jeg har 10 rækker i min Movies tabel.

Id...Navn...LastbilMærkeId..Set
1....Navn1..1...............8
2....Navn2..2...............10
3....Navn3..3...............3
4....Navn4..4...............5
5....Navn5..5...............7
6....Navn6..6...............2
7....Navn7..7...............9
8....Navn8..8...............1
9....Navn9..1...............4
10...Navn10.3...............6

Nu skulle der gerne komme følgende ud:

Id...Navn...LastbilMærkeId..Set
1....Navn1..1...............8
2....Navn2..2...............10
4....Navn4..4...............5
5....Navn5..5...............7
6....Navn6..6...............2
7....Navn7..7...............9
8....Navn8..8...............1
10...Navn10.3...............6

Som du kan se, så er hvert enkelt lastbilmærke repræsenteret én gang og det med højeste sete som den udvalgte.

Håber I kan hjælpe mig....For jeg er lost.

Forøvrigt den der cross apply.....Af en eller anden grund, når jeg forsøger den i min SQL Server Management Studio i Views så stopper studio med at fungere og jeg er nødt til at genstarte den. Jeg bruger Version 2005.
Avatar billede janus_007 Nybegynder
21. november 2009 - 20:11 #3
Okay ja... hvis din tabel så hedder TableTruck, lav evt. et view udfra dine andre 2 tabeller eller bibehold dit join :) up to you...

Og gør sådan :

with truck as (
select row_number() over (partition by LastbilId order by Seet desc) as RN, Id, Navn, LastbilId, Seet
    from TableTruck)
select * from truck
    where RN = 1
   


Test:
create table TableTruck
(
Id int,
Navn varchar(25),
LastbilId int,
Seet int
)

insert into TableTruck
values(1, 'Navn1', 1, 8)
insert into TableTruck
values(2, 'Navn2', 2, 10)
insert into TableTruck
values(3, 'Navn3', 3, 3)
insert into TableTruck
values(4, 'Navn4', 4, 5)
insert into TableTruck
values(5, 'Navn5', 5, 7)
insert into TableTruck
values(6, 'Navn6', 6, 2)
insert into TableTruck
values(7, 'Navn7', 7, 9)
insert into TableTruck
values(8, 'Navn8', 8, 1)
insert into TableTruck
values(9, 'Navn9', 1, 4)
insert into TableTruck
values(10, 'Navn10', 3, 6)
Avatar billede simsen Mester
21. november 2009 - 20:45 #4
Hej igen Janus

Jeg forstår ikke helt din select .....Jeg har forsøgt med nedenviste men får at vide, der er en fejl i nærheden af with

SELECT    *
FROM        dbo.Movies INNER JOIN
                      dbo.TruckBrands ON dbo.Movies.truckBrandFId = dbo.TruckBrands.truckBrandPId
with Movies as (
select row_number() over (partition by moviePId order by movieCounSeen desc) as RN, moviePId, movieNAme, truckBrandFId, movieCountSeen
    from Movies)
select * from Movies
    where RN = 1

Den ene tabel hedder Movies (den der så har en truckBrandFId i sig som henvisning til tabellen TruckBrands) og den anden TruckBrands
Avatar billede janus_007 Nybegynder
21. november 2009 - 21:42 #5
Okay.. så joiner vi bare inden i WITH, no problem...

with MS as (
select row_number() over (partition by moviePId order by movieCounSeen desc) as RN, moviePId, movieNAme, dbo.Movies.truckBrandFId, movieCountSeen
FROM        dbo.Movies INNER JOIN
  dbo.TruckBrands ON dbo.Movies.truckBrandFId = dbo.TruckBrands.truckBrandPId
)
select * from MS
    where RN = 1

Når du laver en WITH lige efter et normalt statement, så husk at afslutte med semicolon.

eks.vis
select * from FooTable;
WITH SomeFun as(select .......)


Ellers så skriv DDL til dine 2 tabeller, og giv mig lidt data, så skal jeg hurtigt skrive SQL'en til dig :)
Avatar billede simsen Mester
21. november 2009 - 21:48 #6
Har lige prøvet det og får stadig samme fejl....

Hvad er en ddl? Så skal jeg laver en hurtigt til dig......måske - jeg er ikke så øvet i det her, har jeg her til aften fundet ud af *griner*
Avatar billede simsen Mester
21. november 2009 - 21:54 #7
Har gjort noget andet........

Har zippet en backup af databasen til dig, der er kun de to tabeller med test data i ....altså udover alle tabellerne til asp.net login - men igen kun test data.

du kan hente den her:

http://www.ansi-design.dk/eksperten/LMTV20091121.zip

mvh
simsen :-)
Avatar billede simsen Mester
22. november 2009 - 21:16 #8
Det endte om med nedenviste:

SELECT    TOP (100) PERCENT A.moviePId, A.movieName, A.movieCountSeen, A.truckBrandFId
FROM        dbo.Movies AS A INNER JOIN
                          (SELECT    truckBrandFId, MAX(movieCountSeen) AS MaxSet
                            FROM          dbo.Movies
                            GROUP BY truckBrandFId) AS B ON A.truckBrandFId = B.truckBrandFId AND A.movieCountSeen = B.MaxSet
ORDER BY A.truckBrandFId
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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