Just nu i M3-nätverket
Jump to content

Distinct och Order By


NoiseKiller

Recommended Posts

Hur i hela fridens namn hämtar man distinct på ett fält och sedan order by på ett annat (i asp med ms-sql)?

Med Select distinct fornamn from personer order by efternamn klagar den på att efternamn måste finnas med i selecten. Men lägger jag med den i selecten blir det inte distinct på fornamn längre.. :(

 

[inlägget skrivet av NoiseKiller]

 

Link to comment
Share on other sites

Man kan inte välja en kolumn och köra distinct på en annan.

men du kan testa såhär

 

Select distinct fornamn from personer order by fornamn

 

eller

 

Select distinct fornamn from (Select fornamn, efernamn from personer group by efternamn, fornamn)

 

 

 

Link to comment
Share on other sites

Vad förväntar du dig för resultat om följande tre rader finns i tabellen:

 

Karl Anka

Berit Bush

Karl Karlsson

 

 

Du har ju då två unika förnamn, Karl och Berit, men tre olika efternamn. Vilket efternamn tycker du Karl ska sorteras efter, Anka eller Karlsson? Hur ska databashanteraren kunna förstå det?

 

Om du vill sortera efter första efternamnet för respektive förnamn kan du göra följande:

 

SELECT fornamn

FROM personer

GROUP BY fornamn

ORDER BY MIN(efternamn)

 

eller (om din DBMS inte klarar ovanstående)

 

SELECT fornamn, MIN(efternamn) AS enamn

FROM personer

GROUP BY fornamn

ORDER BY enamn

 

 

Link to comment
Share on other sites

Vad förväntar du dig...

Om vi gör som såhär att vi kallar fälten [namn] och [ordning] och vi har:

Pelle 1

Kalle 2

Olle 3

Fredrik 4

Kalle

Olle

Kajsa 5

 

Så vill jag sortera ut en av varje namn sorterat efter ordningstalet och de poster som saknar ordningstal behöver inte hämtas..

 

[inlägget skrivet av NoiseKiller] - känner sig allmänt krånglig

 

Link to comment
Share on other sites

I ditt exempel verkar det vara endast en förekomst per namn som har ordning satt. Om det stämmer så blir det ju superenkelt:

 

SELECT namn

FROM personer

WHERE ordning IS NOT NULL

ORDER BY ordning

 

 

Link to comment
Share on other sites

Det blir jobbigt när kunskapen övervinner sinnesnärvaron. :)

Men OM det nu skulle råka finnas [ordning] i 2 fält med samma [namn] så ligger jag troligtvis ganska pyrt till.

 

Aja - det löser sig för hoppningsvis. :)

 

[inlägget skrivet av NoiseKiller]

 

Link to comment
Share on other sites

I så fall får du flera rader med samma namn. Värre är det om något namn saknar värde på ordning, för då får du inte det namnet överhuvudtaget.

 

Vill du vara bergsäker kan du testa följande:

 

SELECT DISTINCT namn

FROM personer AS p1

ORDER BY (SELECT MIN(COALESCE(ordning,99999999))

FROM personer AS p2

WHERE p1.namn = p2.namn)

 

Liten förklaring:

COALESCE(ordning,99999999) returnerar ordning om ordning är skiljt från NULL, annars 99999999.

SELECT MIN(... kommer med andra ord returnera minsta värdet på ordning för ett visst namn, eller om det inte finns något 99999999. 99999999 valde jag för att få dessa värden sist. Om du vill ha dem först, så byt ut mot 0.

 

DISTINCT är nu med igen eftersom annars får man varje rad i tabellen.

 

Detta kräver en del av databashanteraren, även om det är Core SQL-99, så om det inte funkar testa med:

SELECT DISTINCT namn,

(SELECT MIN(COALESCE(ordning,99999999))

FROM personer AS p2

WHERE p1.namn = p2.namn) AS ordn

FROM personer AS p1

ORDER BY ordn

 

Link to comment
Share on other sites

Gulp. Jag tackar enormt för ditt intresse att hjälpa! :thumbsup:

Jag ska testa detta så snart alla hjärnceller kommit hem igen (känns som att de är på utflykt just nu).. ;)

 

Det är en MS SQL-server jag kör mot för övrigt.

Tack än en gång!

 

[inlägget skrivet av NoiseKiller]

 

Link to comment
Share on other sites

Tack jarlh!

 

Du får en poäng för att du med COALESCE hjälpt mig med ett annat problem jag haft.

C.. kan ju även användas för att få fram värdet ur den första av flera olika kolumner som har ett icke-null-värde (annars null , om alla fälten är null, eller default om man angett det)

ex:

SELECT COALESCE(col1, col2, col3, 'N/A') 
FROM tabell

 

/MDN

 

 

 

Link to comment
Share on other sites

Coalesce är en bra funktion, men en databas bör helst ha default-värden definierade för alla kolumner som riskerar fyllas med Null. Indexering och sökning laggas av Null-värden.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...