11. januar 2005 - 08:42Der 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?
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)
[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.
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)
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)
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)
[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.
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
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
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.
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.
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
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)
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.
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());} } } }
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?
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
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.
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?
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.
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?
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.