Avatar billede lund_dk Praktikant
19. september 2006 - 14:32 Der er 2 kommentarer og
1 løsning

Optimere SQL output

Nogen som måske har en idé til at optimere dette script, det tager en rum tid at loade alle de data.
Det er data som dykker ned i MS SQL database og henter ordrer fra Navision Attain.
men denne måde jeg har lavet det, tvinger jeg til at kigge dybt ned i databasen ca 30 gange, fordi jeg loper på den måde jeg gør.

Databasen indeholder over 200.000 poster, så det er jo mange poster der skal kigges gennem.

Nogen idéer til hvordan jeg klarer det bedre?



<table cellpadding="2" cellspacing="1" class="countertable">
                    <tr>
                        <th style="">Denne uge</th>
                        <th style="">DK</th>
                        <th style="">SE</th>
                        <th style="">NO</th>
                        <th style="">KAS</th>
                        <th style="">I alt</th>
                    </tr>
                    <%
                    strTaelDK = 0
                    strTaelSE = 0
                    strTaelNO = 0
                    strTaelKAS = 0
                    strTaelAlle = 0

                    for i = 0 to 6
                    usedate = DateAdd("d",i,thisweek)
                    dbDato = Replace(dbDato,"-","/")
                    strDateFormatted = Year(usedate) & "-" & Month(usedate) & "-" & Day(usedate)
                    if i = 0 then
                    Ugenavn = "Mandag"
                    elseif i = 1 then
                    Ugenavn = "Tirsdag"
                    elseif i = 2 then
                    Ugenavn = "Onsdag"
                    elseif i = 3 then
                    Ugenavn = "Torsdag"
                    elseif i = 4 then
                    Ugenavn = "Fredag"
                    elseif i = 5 then
                    Ugenavn = "L&oslash;rdag"
                    elseif i = 6 then
                    Ugenavn = "S&oslash;ndag"


                    end if
                   
                    strSQLDK = "SELECT TOP 100 PERCENT COUNT_BIG (No_) AS [Antall ordre], [Document Date] FROM dbo.[3S Company A_S$Sales Invoice Header] [3S Company A_S$Sales Invoice Header] WHERE ([Sell-to Customer No_] = '45')  GROUP BY [Document Date] HAVING ([Document Date] = '" & strDateFormatted & "' ) ORDER BY [Document Date] desc"
                    Set RsDK = Conn.Execute(strSQLDK)
                    if rsDK.EOF or rsDK.BOF then
                    DKAntal = "0"
                    else
                    DKantal = RSdk("Antall Ordre")
                    end if
                   
                    strSQLSE = "SELECT TOP 100 PERCENT COUNT_BIG (No_) AS [Antall ordre], [Document Date] FROM dbo.[3S Company A_S$Sales Invoice Header] [3S Company A_S$Sales Invoice Header] WHERE ([Sell-to Customer No_] = '46')  GROUP BY [Document Date] HAVING ([Document Date] = '" & strDateFormatted & "' ) ORDER BY [Document Date] desc"
                    Set RsSE = Conn.Execute(strSQLSE)
                    if rsSE.EOF or rsSE.BOF then
                    SEAntal = "0"
                    else
                    SEantal = RSSE("Antall Ordre")
                    end if
                   
                    strSQLNO = "SELECT TOP 100 PERCENT COUNT_BIG (No_) AS [Antall ordre], [Document Date] FROM dbo.[3S Company A_S$Sales Invoice Header] [3S Company A_S$Sales Invoice Header] WHERE ([Sell-to Customer No_] = '47')  GROUP BY [Document Date] HAVING ([Document Date] = '" & strDateFormatted & "' ) ORDER BY [Document Date] desc"
                    Set RsNO = Conn.Execute(strSQLNO)
                    if rsNO.EOF or rsNO.BOF then
                    NOAntal = "0"
                    else
                    NOantal = rsNO("Antall Ordre")
                    end if
                   
                    strSQLKAS = "SELECT TOP 100 PERCENT COUNT_BIG (No_) AS [Antall ordre], [Document Date] FROM dbo.[3S Company A_S$Sales Invoice Header] [3S Company A_S$Sales Invoice Header] WHERE ([Sell-to Customer No_] = '48')  GROUP BY [Document Date] HAVING ([Document Date] = '" & strDateFormatted & "' ) ORDER BY [Document Date] desc"
                    Set RsKAS = Conn.Execute(strSQLKAS)
                    if rsKAS.EOF or rsKAS.BOF then
                    KASAntal = "0"
                    else
                    KASantal = RSKAS("Antall Ordre")
                    end if
                   
                    strSQLAll = "SELECT TOP 100 PERCENT COUNT_BIG (No_) AS [Antall ordre], [Document Date] FROM dbo.[3S Company A_S$Sales Invoice Header] [3S Company A_S$Sales Invoice Header] WHERE ([Sell-to Customer No_] = '45') OR([Sell-to Customer No_] = '46') OR ([Sell-to Customer No_] = '47') OR ([Sell-to Customer No_] = '48')GROUP BY [Document Date] HAVING ([Document Date] = '" & strDateFormatted & "' ) ORDER BY [Document Date] desc"
                    Set RsAll = Conn.Execute(strSQLAll)
                    if rsAll.EOF or rsAll.BOF then
                    AllAntal = "0"
                    else
                    Allantal = formatnumber(RSAll("Antall Ordre"),0)
                    end if
                    if not AllAntal = "0" then
                    DKAntal = formatnumber(DKAntal,0)
                    SEAntal = formatnumber(SEAntal,0)
                    NOAntal = formatnumber(NOAntal,0)
                    KASAntal = formatnumber(KASAntal,0)
                    AllAntal = formatnumber(AllAntal,0)
                    strTaelDK = StrTaelDK + DKAntal
                    strTaelSE = StrTaelSE + SEAntal
                    strTaelNo = StrTaelNO + NoAntal
                    strTaelKAS = StrTaelKAS + KASAntal
                    strTaelAlle = StrTaelAlle + AllAntal
                    %>
                    <tr >
                        <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>><%=ugenavn%></td>
                        <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>><%=DKAntal%></td>
                        <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>><%=SEAntal%></td>
                        <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>><%=NOantal%></td>
                        <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>><%=KASantal%></td>
                        <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>><%=Allantal%></td>
                    </tr>
                    <%
                    end if
                    RsDK.Close
                    Set RsDK = Nothing
                    RsSE.Close
                    Set RsSE = Nothing
                    RsNO.Close
                    Set RsNO = Nothing
                    RsKAS.Close
                    Set RsKAS = Nothing
                    RsAll.Close
                    Set RsAll =Nothing
                    next
                    %>
                    <tr>
                        <td class="sumbund">I alt</td>
                        <td class="sumbund"><%=strTaelDK%></td>
                        <td class="sumbund"><%=strTaelSE%></td>
                        <td class="sumbund"><%=strTaelNO%></td>
                        <td class="sumbund"><%=strTaelKas%></td>
                        <td class="sumbund"><%=strTaelAlle%></td>
                    </tr>
                </table>
Avatar billede ldanielsen Nybegynder
20. september 2006 - 17:02 #1
Se denne:

SELECT
TOP 100 PERCENT
COUNT(No_) AS [Antall ordre],
[Sell-to Customer No_]
FROM
dbo.[3S Company A_S$Sales Invoice Header] [3S Company A_S$Sales Invoice Header] WHERE
[Sell-to Customer No_] IN ('45', '46', '47', '48')
GROUP BY [Sell-to Customer No_]
HAVING ([Document Date] = '" & strDateFormatted & "' )
ORDER BY [Sell-to Customer No_]

Den vil returnere dette (fx.):

Antall ordre, Sell-to Customer No_
23,45
345,46
145,47
3838,48

Datoen er ikke med, for den har du jo i strDateFormatted



Så kan du loope sådan

<table cellpadding="2" cellspacing="1" class="countertable">
  <tr>
    <th style="">Denne uge</th>
    <th style="">DK</th>
    <th style="">SE</th>
    <th style="">NO</th>
    <th style="">KAS</th>
    <th style="">I alt</th>
  </tr>
<%
intTaelDK = 0
intTaelSE = 0
intTaelNO = 0
intTaelKAS = 0
intTaelAlle = 0

for i = 0 to 6
  intTaelDag = 0
%>
  <tr>
    <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>><%=ugenavn%></td>
<%
  usedate = DateAdd("d",i,thisweek)
  dbDato = Replace(dbDato,"-","/")
  strDateFormatted = Year(usedate) & "-" & Month(usedate) & "-" & Day(usedate)
  if i = 0 then Ugenavn = "Mandag"
  if i = 1 then Ugenavn = "Tirsdag"
  if i = 2 then Ugenavn = "Onsdag"
  if i = 3 then Ugenavn = "Torsdag"
  if i = 4 then Ugenavn = "Fredag"
  if i = 5 then Ugenavn = "L&oslash;rdag"
  if i = 6 then Ugenavn = "S&oslash;ndag"
 
  strSQL = "SELECT TOP 100 PERCENT COUNT(No_) AS [Antall ordre], [Sell-to Customer No_] " & _
    "FROM dbo.[3S Company A_S$Sales Invoice Header] [3S Company A_S$Sales Invoice Header] " & _
    "WHERE [Sell-to Customer No_] IN ('45', '46', '47', '48') " & _
    "GROUP BY [Sell-to Customer No_] " & _
    "HAVING ([Document Date] = '" & strDateFormatted & "' ) ORDER BY [Sell-to Customer No_]"
  Set RsAll = Conn.Execute(strSQL)
  for n = 0 to 3
    if n = 0 then
      'Dette skal være "45"
      if RsAll.BOF or RsAll.EOF then
        'Vi er udenfor recordsettet:
        ThisAntal = "0"
      else
        if RsAll("Sell-to Customer No_") = "45" then
          'Det er "45", så vi henter tal og går videre
          ThisAntal = RsAll("Antall Ordre")
          intTaelDK = intTaelDK + ThisAntal
          RsAll.MoveNext
        else
          'Det er ikke "45"
          ThisAntal = "0"
        end if
      end if
    end if
    if n = 1 then
      'Dette skal være "46"
      if RsAll.BOF or RsAll.EOF then
        'Vi er udenfor recordsettet:
        ThisAntal = "0"
      else
        if RsAll("Sell-to Customer No_") = "46" then
          'Det er "46", så vi henter tal og går videre
          ThisAntal = RsAll("Antall Ordre")
          intTaelSE = intTaelSE + ThisAntal
          RsAll.MoveNext
        else
          'Det er ikke "46"
          ThisAntal = "0"
        end if
      end if
    end if
    if n = 2 then
      'Dette skal være "47"
      if RsAll.BOF or RsAll.EOF then
        'Vi er udenfor recordsettet:
        ThisAntal = "0"
      else
        if RsAll("Sell-to Customer No_") = "47" then
          'Det er "47", så vi henter tal og går videre
          ThisAntal = RsAll("Antall Ordre")
          intTaelNO = intTaelNO + ThisAntal
          RsAll.MoveNext
        else
          'Det er ikke "47"
          ThisAntal = "0"
        end if
      end if
    end if
    if n = 3 then
      'Dette er "48"
      if RsAll.BOF or RsAll.EOF then
        'Vi er udenfor recordsettet:
        ThisAntal = "0"
      else
        if RsAll("Sell-to Customer No_") = "48" then
          'Det er "48", så vi henter tal og går videre
          ThisAntal = RsAll("Antall Ordre")
          intTaelKAS = intTaelKAS + ThisAntal
          RsAll.MoveNext
        else
          'Det er ikke "48"
          ThisAntal = "0"
        end if
      end if
    end if
    intTaelDag = intTaelDag + ThisAntal
    intTaelAlle = intTaelAlle + ThisAntal
%>
 
    <td class="countercel" <%if strDateFormatted = strToday then%>style="background-color:#89A4ED;"<%end if%>>
      <%=ThisAntal%></td>
<%   
  next
  RsAll.Close
  Set RsAll = Nothing
next
%>
  <tr>
    <td class="sumbund">I alt</td>
    <td class="sumbund"><%=strTaelDK%></td>
    <td class="sumbund"><%=strTaelSE%></td>
    <td class="sumbund"><%=strTaelNO%></td>
    <td class="sumbund"><%=strTaelKas%></td>
    <td class="sumbund"><%=strTaelAlle%></td>
  </tr>
</table>

Der er en del jeg ikke er med på, fx. hvorfra du har thisweek, dbDato, og strToday, samt hvorfor du siger <%if strDateFormatted = strToday then .. hver gang
Avatar billede lund_dk Praktikant
27. september 2006 - 10:53 #2
jeg får denne fejl når jeg bruger dit script

Microsoft OLE DB Provider for SQL Server fejl '80040e14'
Column '3S Company A_S$Sales Invoice Header.Document Date' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
Avatar billede lund_dk Praktikant
30. september 2006 - 12:56 #3
lukker..
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
Kurser inden for grundlæggende programmering

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