Avatar billede thomas_n Nybegynder
10. oktober 2008 - 14:51 Der er 17 kommentarer

5 minutter interval

Hej Eksperter,

Er der nogen der kan hjælpe med nedenstående SQL query, der fejler ved afvikling.
Jeg har en tabel der indholder følgende felter: Id, Dato, opkaldstidspunkt.
Jeg har konverteret queryen fra Access hvor den virker..!

SELECT modulusTime, modulusMinut, count(Modulus)
FROM (SELECT
(CAST((DATENAME(hour,opkaldstidspunkt) * 60 + DATENAME(minute,opkaldstidspunkt)) * 60 + DATENAME(second,opkaldstidspunkt) AS INT) / (5 * 60)) *  (5 * 60) AS Modulus,
CAST(Modulus / 3600 AS INT) AS modulusTime,
CAST((Modulus  - modulusTime * 3600) / 60 AS INT) AS modulusMinut
FROM statistik_hvd
) AS [%$##@_Alias]
GROUP BY modulusTime, modulusMinut, Modulus
ORDER BY Modulus

Jeg får denne fejlmeddelelse ved afviklingen:
Msg 207, Level 16, State 1, Line 4
Invalid column name 'Modulus'.
Msg 207, Level 16, State 1, Line 5
Invalid column name 'Modulus'.
Msg 207, Level 16, State 1, Line 5
Invalid column name 'modulusTime'

V.h. Thomas
Avatar billede wagner Nybegynder
12. oktober 2008 - 00:09 #1
Prøv at putte dine navne i []. Så bliver det:

SELECT modulusTime, modulusMinut, count(Modulus)
FROM (SELECT
(CAST((DATENAME(hour,opkaldstidspunkt) * 60 + DATENAME(minute,opkaldstidspunkt)) * 60 + DATENAME(second,opkaldstidspunkt) AS INT) / (5 * 60)) *  (5 * 60) AS [Modulus],
CAST(Modulus / 3600 AS INT) AS [modulusTime],
CAST((Modulus  - modulusTime * 3600) / 60 AS INT) AS [modulusMinut]
FROM statistik_hvd
) AS [%$##@_Alias]
GROUP BY modulusTime, modulusMinut, Modulus
ORDER BY Modulus

Wagner
Avatar billede thomas_n Nybegynder
14. oktober 2008 - 18:28 #2
Hej Wagner,

Prøvede det du foreslog, men nu brokker SQL Serveren sig over navnene i linie 1.

Msg 207, Level 16, State 3, Line 1
Invalid column name 'Modulus'.
Msg 207, Level 16, State 3, Line 1
Invalid column name 'Modulus'.
Msg 207, Level 16, State 3, Line 1
Invalid column name 'modulusTime'.

/Thomas
Avatar billede wagner Nybegynder
14. oktober 2008 - 23:47 #3
Prøv også med [] omkring feltnavnene i din select , group by og order by.
Avatar billede thomas_n Nybegynder
15. oktober 2008 - 00:10 #4
Det gjorde ingen forskel :(

Jeg har eksperimenteret lidt. Hvis jeg erstatter beregningerne med felter i min tabel Statistik_Hvd, så virker querien (se nedenstående).

SELECT modulusTime, modulusMinut, count(Modulus)
FROM (SELECT
Dato AS [Modulus],
Opkaldstidspunkt AS [modulusTime],
KøId AS [modulusMinut]
FROM statistik_hvd
) AS [%$##@_Alias]
GROUP BY modulusTime, modulusMinut, Modulus
ORDER BY Modulus
Avatar billede wagner Nybegynder
15. oktober 2008 - 23:21 #5
Okay

Nu er jeg vist med. Havde faktisk ikke nærlæst din query. Det er fordi, du forsøger at anvende dit beregnede felt i de efterfølgende felter.

Prøv denne her:
SELECT modulusTime, modulusMinut, count(Modulus)
FROM (
    select     CAST(Modulus / 3600 AS INT) AS [modulusTime],
        CAST((Modulus  - modulusTime * 3600) / 60 AS INT) AS [modulusMinut]
    from (
        SELECT (CAST((DATENAME(hour,opkaldstidspunkt) * 60 + DATENAME(minute,opkaldstidspunkt)) * 60 + DATENAME(second,opkaldstidspunkt) AS INT) / (5 * 60)) *  (5 * 60) AS [Modulus],
        FROM statistik_hvd
    ) A
) AS [%$##@_Alias]
GROUP BY modulusTime, modulusMinut, Modulus
ORDER BY Modulus

Jeg har lavet en ny subselect, der anvender modulus fra den første subselect.
Du kan evt undvære den anden subselect, så bare lave de nye beregninger i din select, men så skal du også lave dem i din group by.

Håber det virker :)
Avatar billede thomas_n Nybegynder
17. oktober 2008 - 10:21 #6
Den virker ikke :(

Men hvorfor er der problemer med at bruge beregnede felter i subselecten?
Avatar billede wagner Nybegynder
17. oktober 2008 - 11:12 #7
Det kan man desværre bare ikke.

Enten skal man pakke det ind i en subselect, view eller lignende eller også skal beregningen udføres alle de steder du vil bruge feltet.

Hvad giver den af fejl?
Avatar billede thomas_n Nybegynder
17. oktober 2008 - 12:19 #8
Det er bl.a kommaet i slutningen af linie 6 den ikke kan li' ;)
Når jeg fjerner det og afvikler querien, får jeg denne fejlmeddelelse:
Msg 207, Level 16, State 3, Line 1
Invalid column name 'modulusTime'.
Msg 207, Level 16, State 3, Line 1
Invalid column name 'Modulus'.
Msg 207, Level 16, State 3, Line 1
Invalid column name 'Modulus'.
Msg 207, Level 16, State 3, Line 1
Invalid column name 'Modulus'.
Avatar billede wagner Nybegynder
17. oktober 2008 - 13:28 #9
Ahh, det skal naturligvis fjernes, da vi nu kun udtrækker et felt.
Avatar billede thomas_n Nybegynder
19. oktober 2008 - 23:21 #10
Hej Wagner,

Du har ikke et forslag til hvad der skal til at fixe ovenstående fejl?

V.h.
Thomas
Avatar billede wagner Nybegynder
20. oktober 2008 - 17:46 #11
Har du prøvet, at fjerne det ekstra komma i subselecten efter Modulus. Sådan her:

SELECT modulusTime, modulusMinut, count(Modulus)
FROM (
    select    CAST(Modulus / 3600 AS INT) AS [modulusTime],
        CAST((Modulus  - modulusTime * 3600) / 60 AS INT) AS [modulusMinut]
    from (
        SELECT (CAST((DATENAME(hour,opkaldstidspunkt) * 60 + DATENAME(minute,opkaldstidspunkt)) * 60 + DATENAME(second,opkaldstidspunkt) AS INT) / (5 * 60)) *  (5 * 60) AS [Modulus],
        FROM statistik_hvd
    ) A
) AS [%$##@_Alias]
GROUP BY modulusTime, modulusMinut, Modulus
ORDER BY Modulus
Avatar billede wagner Nybegynder
20. oktober 2008 - 17:46 #12
Ups, den rigtige kommer her:

SELECT modulusTime, modulusMinut, count(Modulus)
FROM (
    select    CAST(Modulus / 3600 AS INT) AS [modulusTime],
        CAST((Modulus  - modulusTime * 3600) / 60 AS INT) AS [modulusMinut]
    from (
        SELECT (CAST((DATENAME(hour,opkaldstidspunkt) * 60 + DATENAME(minute,opkaldstidspunkt)) * 60 + DATENAME(second,opkaldstidspunkt) AS INT) / (5 * 60)) *  (5 * 60) AS [Modulus]
        FROM statistik_hvd
    ) A
) AS [%$##@_Alias]
GROUP BY modulusTime, modulusMinut, Modulus
ORDER BY Modulus
Avatar billede thomas_n Nybegynder
20. oktober 2008 - 23:12 #13
Fik løsningen fra en gammel kollega.

Den krævede at der blev oprettet to functions i SQL serveren, som kaldes via en query.

Giv et praj hvis du er interesseret i løsningen.
Avatar billede thomas_n Nybegynder
20. oktober 2008 - 23:21 #14
Forresten, så gav dit sidste forslag stadig fejlene "invalid column name".

Men tak for dit forsøg på at hjælpe.

Kan ikke helt lure hvordan jeg giver dig point???
Avatar billede wagner Nybegynder
21. oktober 2008 - 09:39 #15
Tja, det nurde ikke gøre nogen forskel om du bruger funktioner eller subselects. Men det vigtigste er, at du fik løst dit problem :)

Hvis du gerne vil have dine point igen, så bare sig til. Jeg bruger dem ikek til noet alligevel.

For andres skyld synes jeg du skal poste din løsning her, hvis der kommer nogen forbi med et lignende problem i fremtiden.

Wagner
Avatar billede thomas_n Nybegynder
21. oktober 2008 - 13:41 #16
Vil ikke have pointene igen - det vigtigste var at du fik dem :)

Her forklaringen og løsningen:

Funktion 1:
CREATE FUNCTION ModulusTime (@opkaldstidspunkt datetime, @IntervalIMinutter int)
RETURNS int
AS
BEGIN
  RETURN(round( ( ( DATEPART(hh, @opkaldstidspunkt) * 60 + DATEPART(mi, @opkaldstidspunkt) ) * 60 + DATEPART(ss, @opkaldstidspunkt)) / (@IntervalIMinutter * 60), 1) *  @IntervalIMinutter * 60 )
END

Funktion 2:
CREATE FUNCTION ModulusTimeTable (@IntervalIMinutter int)
RETURNS TABLE
AS
RETURN (
SELECT
dbo.ModulusTime(Opkaldstidspunkt, @IntervalIMinutter) AS Modulus,
round(dbo.ModulusTime(Opkaldstidspunkt, @IntervalIMinutter) / 3600, 1) AS modulusTime,
round((dbo.ModulusTime(Opkaldstidspunkt, @IntervalIMinutter) - round(dbo.ModulusTime(Opkaldstidspunkt, @IntervalIMinutter) / 3600, 1) * 3600) / 60, 1) AS modulusMinut
FROM Statistik_Hvd)

Query:
SELECT modulusTime, modulusMinut, count(Modulus) from dbo.ModulusTimeTable (5)
GROUP BY modulusTime, modulusMinut, Modulus
ORDER BY Modulus;
Avatar billede thomas_n Nybegynder
21. oktober 2008 - 13:48 #17
Problemet vi sloges med skyldes at MS SQL Server hverken understøtter indlejrede selects eller reference til alias'er ved definition af nye.
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