Avatar billede ameq Nybegynder
26. februar 2005 - 10:16 Der er 17 kommentarer og
1 løsning

Hjælp til gruop by symtax

hej
Jeg har et problem med dette sql script
CREATE VIEW vNyheder
AS
  select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato, count(Nyheder_Kommentarer.Id) as Antal_Kommentar
  from nyheder, Nyheder_Kommentarer
  where Nyheder.id = Nyheder_Kommentarer.Nyhed_Id
  group by nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato
GO

når jeg exec, får jeg denne fejl
Server: Msg 306, Level 16, State 2, Procedure vNyheder, Line 3
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

hvordan kan jeg gruop by på den måde hvis jeg ikke må havde min tekst med?
Avatar billede kjulius Novice
26. februar 2005 - 14:40 #1
Jeg gætter kun, men prøv med

GROUP BY nyheder.id, COALESCE(nyheder.overskrift, ""), COALESCE(nyheder.tekst, "")

Måske skal Null værdier konverteres til en tom streng, før der kan sorteres på disse felter.
Avatar billede ameq Nybegynder
26. februar 2005 - 17:45 #2
coalesce? hva gør den?
Avatar billede ameq Nybegynder
26. februar 2005 - 18:41 #3
jeg får fejlen, Cannot use empty object or column names. Use a single space if necessary.
Avatar billede veronica Nybegynder
26. februar 2005 - 19:19 #4
Hejsa - prøv med det her ..

CREATE VIEW vNyheder
AS
  select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato,
  kommentarer.antal as Antal_Kommentar
  from nyheder,
  ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer
  where Nyheder.id = Kommentarer.Nyhed_Id
GO

Jeg ville i øvrigt bruge et left join til kommentarer, for ellers får du ikke de nyheder, som ikke er kommenteret (?)

mvh. Veronica
Avatar billede ameq Nybegynder
26. februar 2005 - 19:48 #5
den laver ikke fejl, men når jeg henter virker det ikke helt, men jeg vil lige kigge på det der left join
Avatar billede veronica Nybegynder
26. februar 2005 - 20:25 #6
hm... hvad er det der ikke virker ??
Avatar billede kjulius Novice
26. februar 2005 - 23:12 #7
Prøv så at sætte coalesce i både select og group by

CREATE VIEW vNyheder
AS
  select nyheder.id, coalesce(nyheder.overskrift, ' '), coalesce(nyheder.tekst, ' '), nyheder.dato, count(Nyheder_Kommentarer.Id) as Antal_Kommentar
  from nyheder, Nyheder_Kommentarer
  where Nyheder.id = Nyheder_Kommentarer.Nyhed_Id
  group by nyheder.id, coalesce(nyheder.overskrift, ' '), coalesce(nyheder.tekst, ' '), nyheder.dato
GO

Vedr. hvad coalesce gør, så er dette fra Transact-SQL Reference:

COALESCE
Returns the first nonnull expression among its arguments.

Syntax
COALESCE ( expression [ ,...n ] )

Arguments
expression

Is an expression of any type.

n

Is a placeholder indicating that multiple expressions can be specified. All expressions must be of the same type or must be implicitly convertible to the same type.

Return Types
Returns the same value as expression.

Remarks
If all arguments are NULL, COALESCE returns NULL.

COALESCE(expression1,...n) is equivalent to this CASE function:

CASE
  WHEN (expression1 IS NOT NULL) THEN expression1
  ...
  WHEN (expressionN IS NOT NULL) THEN expressionN
  ELSE NULL
Avatar billede ameq Nybegynder
27. februar 2005 - 11:40 #8
kjulius
jeg får den her fejl
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.


veronica
din kode virkede men når jeg brugte den fik jeg ikke noget ud, men det er vel fordi er ikke være en kommentarer? eller hva?
Avatar billede ameq Nybegynder
27. februar 2005 - 11:47 #9
så jeg har prøvet at lave en left join, men den laver en fejl som jeg ikke forstå
CREATE VIEW vNyheder
AS
  select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato,
  kommentarer.antal as Antal_Kommentar
  from nyheder,
  ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer
  --where Nyheder.id = Kommentarer.Nyhed_Id
  left join nyheder on nyheder.id = kommentarer.nyhed_id

Fejlen:
Tables or functions 'nyheder' and 'nyheder' have the same exposed names. Use correlation names to distinguish them.
Avatar billede kjulius Novice
27. februar 2005 - 18:57 #10
Du refererer to gange til tabellen nyheder, den ene gang i en inner join med til inline selecten, den anden gang med en left join, hvilket betyder, at du skal lave en alias på den ene af dem. F.eks.

CREATE VIEW vNyheder
AS
  select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato,
  kommentarer.antal as Antal_Kommentar
  from nyheder,
  ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer
  --where Nyheder.id = Kommentarer.Nyhed_Id
  left join nyheder N on N.id = kommentarer.nyhed_id
Avatar billede ameq Nybegynder
28. februar 2005 - 16:36 #11
mit view er stadig tomt, selv om der stå noget i min nyhed tabel
Avatar billede kjulius Novice
28. februar 2005 - 21:06 #12
Jeg kiggede ikke rigtigt på din SQL, men du har vist ikke implementeret din left join som veronica forestillede sig det. Prøv med:


CREATE VIEW vNyheder
AS
  select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato,
  kommentarer.antal as Antal_Kommentar
  from nyheder LEFT JOIN
  ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer
  ON Nyheder.id = Kommentarer.Nyhed_Id
Avatar billede ameq Nybegynder
28. februar 2005 - 21:52 #13
yes så virker det, men er der en mulighed for at man kan test om antal er null f.eks
og hvis den er så sætte et 0
CREATE VIEW vNyheder
AS
  select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato,
 
  isnull(kommentarer.antal,kommentarer.antal,0) as Antal_Kommentar
 
  from nyheder LEFT JOIN
  ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer
  ON Nyheder.id = Kommentarer.Nyhed_Id
Avatar billede kjulius Novice
01. marts 2005 - 08:48 #14
Det er netop her COALESCE kommer ind. Den vil returnere den første af de opgivne værdier som ikke er null. Hvis du altså angiver et databasefelt og en fast værdi som parametre, vil den returnere databasefeltet hvis det ikke er null, ellers den faste værdi:

CREATE VIEW vNyheder
AS
  select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato,
  COALESCE(kommentarer.antal, 0) as Antal_Kommentar
  from nyheder LEFT JOIN
  ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer
  ON Nyheder.id = Kommentarer.Nyhed_Id
Avatar billede ameq Nybegynder
01. marts 2005 - 10:17 #15
okey, jeg vil lige lege med det når jeg kommer hjem, men jeg vil tror det virker nu så kommer du med at svar?
Avatar billede veronica Nybegynder
01. marts 2005 - 12:39 #16
Hej igen - fik ikke lige fulgt med ..
Kjulius: det lader til at du bruger COALESCE på samme måde som isNull funktionen ? Er det det samme .. ??
Håber, det kommer til at virke :)
Avatar billede kjulius Novice
01. marts 2005 - 19:59 #17
--> veronica: Jeg bruger altid COALESCE, men jeg har lige tjekket manualen, og det synes som om, det er næsten det samme. COALESCE er en lidt udbygget version af ISNULL, ser det ud til.

COALESCE kan have flere parametre, sådan at man kan vælge det første felt, som ikke er null. Det kan f.eks. bruges til at finde en værdi blandt flere felter, hvor en bruger kan indtaste noget, men hvor man ikke kan være sikker på, at det første felt blev brugt:

COALESCE(felt1, felt2, felt3, 0), vil tjekke felterne i den angivne rækkefølge, og returnere det første felt, som ikke er null. Hvis hverken felt1, felt2 eller felt3 indeholder nogen værdi, returneres en default værdi, som her er sat til 0.

Modsat har ISNULL kun mulighed for at angive 2 parametre. Det vil selvfølgelig i de fleste tilfælde være nok, så valget er næsten frit...

Jeg håber da også, at ameq får din let modificerede SQL sætning til at virke. Jeg synes også du skulle tage at smide et svar, så kan ameq jo tage stilling til hvem han (eller er det hun?) vil give point, eller om de kan deles.
Avatar billede ameq Nybegynder
01. marts 2005 - 20:39 #18
ja du var da godt på vej så hvis der ikke er nolge som får ondt i røven så syns jeg da også du skal havde en bid af kagen
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