Avatar billede pnr Nybegynder
11. januar 2005 - 08:42 Der er 49 kommentarer og
2 løsninger

sortering efter uge nummere og sætte den første ugedag

Jeg har følgende sql sætning;

ELECT    TOP 100 PERCENT DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundenr = 5)
GROUP BY DATEPART(WEEK, dato)
ORDER BY ugenr

Jeg vil så gerne have sorteret denne forespørgsel efter ugen nr. (52, 53, 1, 2 ,3......) hvordan gør jeg det?

Derudover vil jeg gerne have sat den første ugedag til mandag, hvor dan gør jeg det?
Avatar billede arne_v Ekspert
11. januar 2005 - 08:49 #1
SET DATEFIRST 1

bør sætte mandag til første dag (som man bruger det i DK)
Avatar billede arne_v Ekspert
11. januar 2005 - 08:50 #2
Jeg er ikke helt sikker på sorteringen, men jeg tror muligvis at du vil
sortere efter både år og uge således at du får:

2004 52
2004 53
2005 1
2005 2
Avatar billede pnr Nybegynder
12. januar 2005 - 14:43 #3
Hvordan vil min sql-sætning så komme til at se ud?
Avatar billede pnr Nybegynder
18. januar 2005 - 10:10 #4
Er der et forslag?
Avatar billede arne_v Ekspert
18. januar 2005 - 10:52 #5
ORDER BY DATEPART(YEAR, dato),DATEPART(WEEK, dato)

formoder jeg
Avatar billede pnr Nybegynder
18. januar 2005 - 11:09 #6
SELECT    TOP 100 PERCENT DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundenr = 5)
GROUP BY DATEPART(WEEK, dato)
ORDER BY DATEPART(YEAR, dato),DATEPART(WEEK, dato)

Nu har jeg prøvet følgende og det virker ikke.
Avatar billede arne_v Ekspert
18. januar 2005 - 20:38 #7
Kan du uddybe "virker ikke" ?
Avatar billede pnr Nybegynder
24. januar 2005 - 08:52 #8
Jeg får følgende fejl:

[Microsoft][ODBC SQL Server Driver][SQL Server]Column name 'tblKunder.dato' is invalid in the ORDER BY clause because it is not in either an aggregate function or the GROUP BY clause.
Avatar billede arne_v Ekspert
24. januar 2005 - 10:17 #9
Hvordan ser SQL ud ?
Avatar billede pnr Nybegynder
24. januar 2005 - 10:23 #10
SELECT    TOP 100 PERCENT DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundenr = 5)
GROUP BY DATEPART(WEEK, dato)
ORDER BY DATEPART(YEAR, dato),DATEPART(WEEK, dato)
Avatar billede arne_v Ekspert
24. januar 2005 - 10:28 #11
Mystisk

tblKunder.dato er nemlig ikke i din ORDER BY
Avatar billede pnr Nybegynder
24. januar 2005 - 10:35 #12
Jeg har kopieret sql-sætningen som du ser ovenfor og afviklet den på sql-serveren, har så skrevet den fejl jeg får ordret!
Avatar billede pnr Nybegynder
27. januar 2005 - 12:59 #13
Er der mere hjælp her?
Avatar billede arne_v Ekspert
27. januar 2005 - 13:01 #14
Jeg har ikke mange ideer tilbage.

Måske:

SELECT    TOP 100 DATEPART(YEAR, dato) AS Aar,PERCENT DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundenr = 5)
GROUP BY DATEPART(WEEK, dato)
ORDER BY DATEPART(YEAR, dato),DATEPART(WEEK, dato)
Avatar billede pnr Nybegynder
27. januar 2005 - 13:07 #15
Så får jeg fejlen: Incorrect syntax near the keyword 'PERCENT'
Avatar billede arne_v Ekspert
27. januar 2005 - 13:11 #16
det er mig som er en har pastet ind forkert.

SELECT    TOP 100 PERCENT DATEPART(YEAR, dato) AS Aar,DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundenr = 5)
GROUP BY DATEPART(WEEK, dato)
ORDER BY DATEPART(YEAR, dato),DATEPART(WEEK, dato)
Avatar billede pnr Nybegynder
27. januar 2005 - 13:48 #17
Så får jeg følgende fejl igen:

[Microsoft][ODBC SQL Server Driver][SQL Server]Column name 'tblKunder.dato' is invalid in the ORDER BY clause because it is not in either an aggregate function or the GROUP BY clause.
Avatar billede arne_v Ekspert
27. januar 2005 - 14:00 #18
så må jeg melde pas
Avatar billede jtbroad Nybegynder
09. februar 2005 - 12:41 #19
Måske fordi du har brugt aliasser?
ORDER BY Aar,Ugenr
Avatar billede pnr Nybegynder
10. februar 2005 - 12:26 #20
Nej for i Arnes sidste eksempel er der ikke brugt aliasser.
Avatar billede jtbroad Nybegynder
10. februar 2005 - 12:45 #21
Prøv det her, tror det virker

SELECT    TOP 100 PERCENT DATEPART(YEAR, dato) AS Aar,DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundenr = 5)
GROUP BY  dato
ORDER BY Aar, Ugenr
Avatar billede jtbroad Nybegynder
10. februar 2005 - 12:47 #22
Det er sådan du vil have ikke?

Aar    Ugenr  Antal
2005    1    1
2005    6    1
2005    7    1
2005    10    1
2005    11    1
2005    11    1
Avatar billede pnr Nybegynder
10. februar 2005 - 12:56 #23
Nu skriver den:

Aar    Ugenr  Antal
2005    1    1
2005    6    1
2005    6    1
2005    6    1
2005    6    1
2005    7    1
2005    10    1
2005    11    1
2005    11    1

Dvs. den skriver en linie for hver post, tror jeg.
Avatar billede jtbroad Nybegynder
10. februar 2005 - 13:17 #24
Ja selvfølgelig det er jo det du har bedt om :-)

SELECT    TOP 100 PERCENT DATEPART(YEAR, dato) AS Aar,DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
GROUP BY  dato,datepart(week,dato)
ORDER BY Aar, Ugenr

giver
Aar    Ugenr  Antal
2005    1    2
2005    6    1
2005    7    1
2005    10    1
2005    11    1
2005    11    1
2005    12    3
Men er ikke opdelt efter kundenr
Avatar billede pnr Nybegynder
10. februar 2005 - 13:24 #25
Jeg har brug for at have det kundenr med, den oprindelige sql-sætning retunerede alle posterne for hver uge, for et bestemt kundenr. Problemet var sorteringen fordi jeg ingen årstal havde med, så den sorterede ugerne i 2005 før ugerne i 2004. Det var det jeg gerne ville have lavet om.
Avatar billede jtbroad Nybegynder
10. februar 2005 - 13:49 #26
så virker den med kundenr i så...du får dog en række for hver distinct dato
kan ikke rigtig hitte ud af en måde at gruppere alle resultaterne indenfor en given uge.

Aar  Ugenr  Antal
2003    7    1
2004    1    1
2005    1    2
2005    6    1
2005    7    1
2005    10    1
2005    11    1
2005    11    1
2005    12    2
Avatar billede pnr Nybegynder
10. februar 2005 - 13:58 #27
Har du noget sql?
Avatar billede jtbroad Nybegynder
10. februar 2005 - 14:30 #28
Det var jo denne her:-
SELECT    TOP 100 PERCENT DATEPART(YEAR, dato) AS Aar,DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundenr = 5)
GROUP BY  dato
ORDER BY Aar, Ugenr

men denne giver samme resultat

SELECT    TOP 100 PERCENT DATEPART(YEAR, dato) AS Aar,DATEPART(WEEK, dato) AS Ugenr, COUNT(*) AS Antal
FROM        dbo.tblKunder
WHERE    (kundnr = 5)
GROUP BY  dato
Avatar billede pnr Nybegynder
10. februar 2005 - 14:55 #29
Kan det så ikke lade sig gøre?
Avatar billede jtbroad Nybegynder
10. februar 2005 - 16:31 #30
Muligvis, men tror ikke det kan gøres med en simpel select statement.
Avatar billede jtbroad Nybegynder
14. februar 2005 - 09:55 #31
O.K. Kan det her måske bruges?

Declare @ugenr int
Declare @aar int
Declare @antal int
Set @ugenr= 1
Set @aar = 0000
Set @antal= 1
set @aar = (select distinct min( datepart(year,dato)) from dbo.tblkunder where kundnr=5)
while @aar in (select datepart(year,dato) from dbo.tblkunder where kundnr=5)
begin
set @ugenr=1
While (@ugenr<54)
begin
set @antal = (select count(*) from dbo.tblkunder where kundnr=5 and datepart(week,dato)=@ugenr and datepart(year,dato)= @aar)
if @antal != 0
print 'År: ' + cast(@aar as varchar) + ' ' + 'Ugenr: ' +cast(@ugenr as varchar) + ' ' + 'Antal: ' + cast(@antal as varchar)

set @ugenr = @ugenr+1
end
set @aar= @aar+1
end

Resultat:
År: 2003 Ugenr: 7 Antal: 1
År: 2004 Ugenr: 1 Antal: 1
År: 2005 Ugenr: 1 Antal: 2
År: 2005 Ugenr: 6 Antal: 1
År: 2005 Ugenr: 7 Antal: 1
År: 2005 Ugenr: 10 Antal: 1
År: 2005 Ugenr: 11 Antal: 2
År: 2005 Ugenr: 12 Antal: 2
Avatar billede pnr Nybegynder
14. februar 2005 - 13:08 #32
jtbroad: Du giver ikke op så let :-)

Det ser ud til at virke, nu er mit problem at når jeg prøver at få de data over i min kode kommer der ingen data. Skifter jeg det kode du har skrevet ud med en simpel select sætning virker det fint. Nogen ide om hvad der kan være galt?

Jeg skal nok forhøje pointne hvis vi også får løst det her problem.
Avatar billede jtbroad Nybegynder
14. februar 2005 - 15:31 #33
Hvaffor noget kode skal du have data ind i?
Avatar billede pnr Nybegynder
14. februar 2005 - 15:36 #34
asp.net
Avatar billede jtbroad Nybegynder
14. februar 2005 - 15:38 #35
Vender frygtelig tilbage senere.
Avatar billede jtbroad Nybegynder
15. februar 2005 - 16:05 #36
public class Form1 : System.Windows.Forms.Form
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        public static int i,j;
        private System.ComponentModel.Container components = null;
        public string myConnStr = @"workstation id=JTB;packet size=4096;user id=sa;data source='JTB\JASONSQL';initial catalog=EkspertenTester";
        public static string myGetMinYear = "Select min(datepart(year,dato)) from dbo.tblKunder where kundnr='5'";
        public static string myGetMaxYear = "Select max(datepart(year,dato)) from dbo.tblKunder where kundnr='5'";
       
        private System.Windows.Forms.DataGrid dataGrid1;

.......
.......
private void Form1_Load(object sender, System.EventArgs e)
        {
            SqlConnection myConn = new SqlConnection(myConnStr);
            DataSet dsKunder = new DataSet();
            SqlCommand getMinYr = new SqlCommand(myGetMinYear,myConn);
            SqlCommand getMaxYr = new SqlCommand(myGetMaxYear,myConn);
            try
            {
                ArrayList myList = new ArrayList();
                myConn.Open();
                int minYr = int.Parse(getMinYr.ExecuteScalar().ToString());
                int maxYr = int.Parse(getMaxYr.ExecuteScalar().ToString());
                //myConn.Close();
                label2.Text= minYr.ToString();
                label3.Text=maxYr.ToString();
                for (i=minYr;i<=maxYr;i++)
                {
                    for (j=1;j<=53;j++)
                    {
                        string myCommandStr = "SELECT  count(*) as Antal from dbo.tblKunder where kundnr ='5' and datepart(year,dato) ='" + i +
                            "' and datepart(week,dato) = '" + j + "'";
                        SqlCommand myCommand = new SqlCommand(myCommandStr,myConn);
                        int thisTotal =int.Parse(myCommand.ExecuteScalar().ToString());
                        if (thisTotal >0)
                            myList.Add(new clsListItem(i,j,thisTotal));                       
                    }
                }
                myConn.Close();   
                dataGrid1.DataSource= myList;
            }
            catch(System.Exception ex)
            {MessageBox.Show(ex.Message.ToString());}
        }
    }
}
Avatar billede jtbroad Nybegynder
15. februar 2005 - 16:06 #37
requires

public class clsListItem
    {
        private int FYear;
        private int FWeek;
        private int FTotal;

        public clsListItem(int year,int week,int total)
        {
            FYear = year;
            FWeek = week;
            FTotal = total;
        }

        public int Year
        {
            get{return FYear;}
        }
       
        public int Week
        {
            get{return FWeek;}
        }

        public int Total
        {
            get{return FTotal;}
        }
    }
}
Avatar billede jtbroad Nybegynder
15. februar 2005 - 16:07 #38
Være glad for det kun koster points og ikke konsulent honorar :-)
Kan du få den til at virke?
Avatar billede pnr Nybegynder
16. februar 2005 - 08:58 #39
Du går da helt amok! Jeg spurgte jo bare til lidt hjælp med at få resultatet fra en stored procedure over i min asp.net kode.

Nu har du godt nok posted en masse fin kode, men ville det ikke være bedre at lade sql-serveren finde resulatet og retunere dette via en stored procedure?
Avatar billede jtbroad Nybegynder
16. februar 2005 - 11:52 #40
Jo, det kunne der være noget om :-)
Kan bare ikke umiddelbart husk hvordan man passer parametre til en sp og får dem ude igen.
Avatar billede jtbroad Nybegynder
16. februar 2005 - 12:34 #41
Det her har brug for lidt justering. Får kun den højeste datos resultat.

CREATE PROCEDURE  dbo.getTotals
@KundNr int,
@Total int output,
@Year int output,
@WeekNr int output
AS

Declare @ugenr int
Declare @aar int
Declare @antal int
Set @ugenr= 1
Set @aar = 0000
Set @antal= 1
set @aar = (select distinct min( datepart(year,dato)) from dbo.tblkunder where kundnr=@KundNr)
while @aar in (select datepart(year,dato) from dbo.tblkunder where kundnr=@KundNr)
begin
set @ugenr=1
While (@ugenr<54)
begin
set @antal = (select count(*) from dbo.tblkunder where kundnr=@KundNr and datepart(week,dato)=@ugenr and datepart(year,dato)= @aar)
if @antal != 0

select @Year = @aar,@WeekNr = @ugenr,@Total=@antal
set @ugenr = @ugenr+1
end
set @aar= @aar+1
end


Og til at kalde proceduren:
Declare @KundNr INT
Declare @YearResult INT
Declare @WeekNrResult INT
Declare @TotalResult INT

Exec getTotals @KundNr = 5,
@Year = @YearResult output,
@WeekNr = @WeekNrResult output,
@Total = @TotalResult output

PRINT 'Aar: ' + cast(@YearResult as Varchar)+' Ugenr: '+cast(@WeekNrResult as Varchar)+
' Antal: ' +cast(@TotalResult as Varchar)

Synes stadig min C# virker bedre. :-)
Avatar billede pnr Nybegynder
16. februar 2005 - 13:36 #42
Nå men jeg kan godt modtage data fra en stored procedure i min asp.net kode, det gør jeg på følgende måde:

DataSet ds = SqlHelper.ExecuteDataset(connStr, CommandType.StoredProcedure, "stStatistik", new SqlParameter("@kundenr", "5") );

Response.Write(ds.GetXml());

Det virker fint, bare ikke med den kode du postede den 14/02-2005 09:55:45.

Hvad er det du har posted nu, hvordan skal jeg bruge det?
Avatar billede jtbroad Nybegynder
16. februar 2005 - 13:53 #43
Hvis du ændrer kundnr til kundenr i min kode og @Kundnr til @KundeNr skulle du kunne kalde proceduren getTotals på samme måde.
Problemet ligger i at den returnere kun den sidste dato.
Grunden til C# koden var netop at til at bearbejde ds resultaterne til at få den sidste gruppering af resultaterne. Row count hvor år og ugenr var ens.
ellers skulle sp'en omskrives sådan at man kalder den med samtlige variabler med undtagelsen af antal og adder resultaterne til datasettet.
Avatar billede pnr Nybegynder
16. februar 2005 - 14:14 #44
Jeg er i tvivl om hvor jeg skal skrive det her:

Declare @KundNr INT
Declare @YearResult INT
Declare @WeekNrResult INT
Declare @TotalResult INT

Exec getTotals @KundNr = 5,
@Year = @YearResult output,
@WeekNr = @WeekNrResult output,
@Total = @TotalResult output

PRINT 'Aar: ' + cast(@YearResult as Varchar)+' Ugenr: '+cast(@WeekNrResult as Varchar)+
' Antal: ' +cast(@TotalResult as Varchar)
Avatar billede jtbroad Nybegynder
16. februar 2005 - 15:46 #45
Det er bare en SQL query der kører SP'en så at du kunne prøve den.
Det laver i bund og grund det samme som din .net kode
Avatar billede pnr Nybegynder
17. februar 2005 - 12:29 #46
Den retunere kun et resultat.

Jeg forstår bare ikke at jeg ikke kan modtage de data fra den stored procedure i min asp.net kode, hvis jeg propper en alm select statment ind i den stored procedure virker det fint! Kan det have noget at gøre med den "print" funktion du bruger?
Avatar billede jtbroad Nybegynder
17. februar 2005 - 15:55 #47
Problemet med at køre en simpel select er netop at du får 1 linie i din dataset for hver dato i tabellen. jvf. 10/02/05 kl.13:49:55.
Hvis du skulle bruge en sp skal du passe kundnr og årstal og ugenr som parametre.
Din dataset ved jeg ikke hvordan vil se ude.
Løsningen var netop C# koden der opbygget Datasettet ved at add hver resultat der ikke var 0 til.

Må jeg foreslå at du lukker denne spørgsmål og poster en nyt med din asp kald
og den sp du bruger og se om der er andre med en bedre ide.
Avatar billede jtbroad Nybegynder
02. marts 2005 - 16:05 #48
Er det lykkedes for dig?
Avatar billede pnr Nybegynder
04. marts 2005 - 06:12 #49
Nej det er ikke lykkes for mig endnu men jeg har heller ikke fået rodet med det. Du må meget undskylde at det har trukket sådan ud!! Jeg må heller få spørgsmålet rundet af i en fart :-) Hvad siger du til hvis jeg forhøjre spørgsmålet med 50 point, så får du 80 point som tak for din SUPER indsats. Vil du være tilfreds med det jtbroad?
Avatar billede jtbroad Nybegynder
04. marts 2005 - 13:40 #50
Det er mere  end generøse. Tror stadigvæk din bedste løsning er at bygge datasettet i koden. Held og lykke med det.
Avatar billede pnr Nybegynder
04. marts 2005 - 13:54 #51
Så siger jeg mange tak!!
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