Avatar billede macadisé Novice
19. juni 2015 - 11:56 Der er 13 kommentarer og
1 løsning

Kolonne uden navn

Jeg har optalt alle bynavne i min DB alt efter hvor mange der bor i hver by, men kolonnen har ikke rigtigt noget navn, så jeg har ikke mulighed for at bruge kolonnen, eller hvad.

Jeg vil gerne bruge optælningen til at katogorisere byerne alt efter hvor mange gange i er repræsenteret.

Jeg har nogle screendumps, men har lidt svært ved at implementere dem :-(
Avatar billede erikjacobsen Ekspert
19. juni 2015 - 13:16 #1
Sådan giver du den et navn:

  select count(*) as antal, bynavn, osv
Avatar billede macadisé Novice
19. juni 2015 - 19:36 #2
Umiddelbart virker det, men jeg vil bruge kolonnenavnet efterføglende, og det virker som om man ikke kan referere til et alias?

Jeg får denne fejlkode:

Msg 207, Level 16, State 1, Line 4
Invalid column name 'town_count'.
Msg 207, Level 16, State 1, Line 4
Invalid column name 'town_count'.

Når jeg kører SQL koden nedeunder:

SELECT COUNT(*) AS town_count, town FROM customers GROUP BY town

ORDER BY CASE town_count
WHEN 6 THEN 'SMALL'
WHEN 7 THEN 'LARGE'
ELSE 'something else'
END;

Jeg vil katogorisere byerne alt efter om de er repræsenteret 6 el. 7 gange som SMALL eller LARGE.
Avatar billede erikjacobsen Ekspert
19. juni 2015 - 19:46 #3
Så skriver du bare udtrykket igen

  ORDER BY CASE count(*)

Andre databasesystemer tillader sommetider at du anvender navnet igen
Avatar billede macadisé Novice
19. juni 2015 - 20:59 #4
Super, det lader til at virke... Jeg har dog ikke fået den til at skrive SMALL og LARGE hhv.
Avatar billede erikjacobsen Ekspert
19. juni 2015 - 21:39 #5
Den vil sortere efter de to tekster, men ikke returnere dem som værdier. Så skal du mellem SELECT og FROM:

SELECT  CASE COUNT(*)
WHEN 6 THEN 'SMALL'
WHEN 7 THEN 'LARGE'
ELSE 'something else'
END AS etellerandet, ... osv ....

...men du kunne også lave dette i det programmeringssprog du sikkert har ovenpå. Lad databasen om data, og programmeringssproget om at vise data.
Avatar billede Slettet bruger
20. juni 2015 - 13:10 #6
Man kan altid lave en order by et alias men du kan ikke lave en where på et alias

din sql skal se nogenlunde sådan her ud:

SELECT COUNT(*) AS town_count, town,CASE WHEN count(*) = 6 Then 'SMALL' WHEN COUNT(*) = 7 Then 'LARGE' Else end as Inddeling FROM customers GROUP BY town

ORDER BY town_count
Avatar billede macadisé Novice
20. juni 2015 - 18:38 #7
Det er en skole opg, så det skulle helst være i SQL :-)
Avatar billede macadisé Novice
20. juni 2015 - 18:40 #8
Det virker rimeligt fixet det du skriver, men "Inddeling" virker noget malplaceret og det virker desværre ikke...
Avatar billede Slettet bruger
20. juni 2015 - 18:49 #9
fixet? snakker du om? og det er også SQL.

SELECT COUNT(*) AS town_count, town,CASE WHEN count(*) = 6 Then 'SMALL' WHEN COUNT(*) = 7 Then 'LARGE' Else end as Inddeling FROM customers GROUP BY town

ORDER BY town_count

Din case viser dig hvad indholdet bliver.

Så lav en

SELECT town,CASE WHEN count(town) = 6 Then 'SMALL' WHEN COUNT(town) = 7 Then 'LARGE' Else end as Inddeling FROM customers GROUP BY town

order by count(*)
Avatar billede Slettet bruger
20. juni 2015 - 19:11 #10
Har lavet et lille test forsøg til dig så du bedre kan forstå hvordan det virker hvor jeg har tastet skanderborg og aarhus ind:

SELECT count( [Town]) as AntalTowns,town
  FROM [Testdata].[dbo].[customers]

  group by town

Dette giver resultatet:
AntalTowns    town
3    Skanderborg
2    Aarhus

Nu vil du så gerne markere dem som large eller small det gør man sådan her:


SELECT count( [Town]) as AntalTowns,town,case when count(town) = 2 then 'small' when count(town) = 3 then 'large'  end as Byindeling
  FROM [Testdata].[dbo].[customers]

  group by town

  order by count(town)

Dette giver resultatet:

AntalTowns    town    Byindeling
2    Aarhus    small
3    Skanderborg    large

Kald den byindeling whatever rocks your boat.
Avatar billede macadisé Novice
20. juni 2015 - 19:46 #11
Okey, jeg forstår udemærket hvad du mener nu...

Det virker dog desværre ikke, der er en fejl omkring END:

Incorrect syntax near the keyword 'END'.
Avatar billede Slettet bruger
20. juni 2015 - 19:56 #12
Ikke i den her

SELECT count( [Town]) as AntalTowns,town,case when count(town) = 2 then 'small' when count(town) = 3 then 'large'  end as Byindeling
  FROM [Testdata].[dbo].[customers]

  group by town

  order by count(town)

Har selv testet den af.
Avatar billede Slettet bruger
20. juni 2015 - 19:57 #13
fjern else til sidst
Avatar billede macadisé Novice
20. juni 2015 - 21:54 #14
Ja, fik det til at virke :-)

Skulle fifle lidt med det, men det lykkedes og det kom til at se sådan ud:

SELECT COUNT(*) AS town_count, town,
CASE WHEN count(*) = 6 Then 'SMALL' WHEN COUNT(*) = 7 Then 'LARGE' ELSE 'something else'
END AS 'City Cato'
FROM customers
GROUP BY town
ORDER BY town_count
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