Avatar billede webbe Nybegynder
12. april 2002 - 07:49 Der er 21 kommentarer og
2 løsninger

GROUP BY problem

Hejsa

Jeg er igang med at lave en online registrering af alt vores hardware på vores lager.

Nu vil jeg så gerne have en liste over alle kategorier med tilhørende oprettet hardware grupperet efter kategori.

Men jeg har bare nogle problemer.

Følgende sql:

strSQL = "SELECT * FROM HardwareIndex GROUP BY Kategori"
Set rs = Connect.Execute(strSQL)

giver følgende fejl:

Microsoft][ODBC Microsoft Access Driver] Cannot group on fields selected with '*'.

/hardware/frameset/print_all.asp, line 20

linie 20 er den ovenstående sql-statement.

Følgende sql:

strSQL = "SELECT Maerke FROM HardwareIndex GROUP BY Kategori"
Set rs = Connect.Execute(strSQL)

giver følgende fejl:

[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'Maerke' as part of an aggregate function.

/hardware/frameset/print_all.asp, line 20


linie 20 er stadig min sql-statement.

Nogen der kan hjælpe mig?
Avatar billede thomas_yde Nybegynder
12. april 2002 - 08:25 #1
GROUP BY samler dem i en resultset.
jeg tror du hellere skulle bruge ORDER BY
Avatar billede webbe Nybegynder
12. april 2002 - 08:35 #2
Har prøvet med ORDER BY, men den lister bare dem alle sammen i én lang række uden at inddele dem i kategorierne - og det er ikke det der er meningen.

Meningen kan illustreres på følgende måde:


"SKÆRME"

SERIENR      MÆRKE        MODEL      ANTAL        PÅ LAGER
1234          Hansol      710        1            Ja
5678          Phillips    PW600      1            Nej


"RAM"
SERIENR      MÆRKE        MODEL      ANTAL        PÅ LAGER
12345        Kingston                1            Ja
67890        Apacer                  1            Ja

osv., osv.

Og jeg vil kun bruge ét recordset til det.
Avatar billede kelo Nybegynder
12. april 2002 - 09:00 #3
SELECT serienr, mærke, model, antal, på lager
From HardwareIndex
Group by Mærke, Model, Serienr, antal, på lager

Du skal selecte alle de du vil group by på.
Avatar billede webbe Nybegynder
12. april 2002 - 09:04 #4
kelo:

Har nu følgende (som til forveksling ligner det nævnte 2. forslag)

strSQL = "SELECT Id,Kategori,Maerke,Model,Serienr,Maerke,Model,Lagerstatus,Antal FROM HardwareIndex GROUP BY Kategori"
Set rs = Connect.Execute(strSQL)

men jeg får stadig følgende fejl:

[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'Id' as part of an aggregate function.

/hardware/frameset/print_all.asp, line 20
Avatar billede kelo Nybegynder
12. april 2002 - 09:05 #5
Du skal group by dem alle.

Kategori, Id, maerke, model, serienr osv osv.
Avatar billede webbe Nybegynder
12. april 2002 - 09:10 #6
Okay - nu har jeg bare ét problem så....hvordan får jeg så udskrevet kategorien én gang istedet for hvert recordset?

Og hvordan får jeg kategorioverskriften til at skifte automatisk?
Avatar billede kelo Nybegynder
12. april 2002 - 09:16 #7
Hmm prøv med

Select Serienr, maerke, model osv
From havdwareIndex group by Kategori
Having kategori = "Ram"

Så skulle du få alle vare i ram kat.
Avatar billede webbe Nybegynder
12. april 2002 - 09:26 #8
Ja - det gør jeg også, men hvad så med alle de andre 25 kategorier?
Avatar billede thomas_yde Nybegynder
12. april 2002 - 10:14 #9
kan du ikke:
SELECT Kategori,Maerke,Model,Serienr,Maerke,Model,Lagerstatus,Antal
FROM HardwareIndex
GROUP BY Kategori
ORDER BY Maerke

?
Avatar billede webbe Nybegynder
12. april 2002 - 10:15 #10
thomas_yde:

Nope - det er jo ikke det jeg vil!
Avatar billede thomas_yde Nybegynder
12. april 2002 - 10:18 #11
hvorfor ikke det ?
Avatar billede webbe Nybegynder
12. april 2002 - 10:20 #12
Fodri en ORDER BY ikke giver det resultat som jeg skal bruge.
Avatar billede thomas_yde Nybegynder
12. april 2002 - 10:25 #13
øhh den gruper efter kategori og derefter sortere den efter mærke...

jeg troede det var det du ville
Avatar billede webbe Nybegynder
12. april 2002 - 10:28 #14
thomas_yde:

Til dels ja - men den grupperer ikke som den skal....prøv at kigge på hvordan jeg skitserede det...som det er nu kommer den kun med én Kategori som indeholder samtlige records i tabellen.
Og det er bestemt ikke det jeg vil!
Avatar billede kelo Nybegynder
12. april 2002 - 10:40 #15
Sådan du gerne vil have det, kan jeg kun se en løsning hvor du kalder kategorierne en efter en.
Avatar billede webbe Nybegynder
12. april 2002 - 10:42 #16
Hmmmm - har selv en teori der måske virker, men den skal jeg først have testet!
Avatar billede kelo Nybegynder
12. april 2002 - 10:43 #17
Hvis du finder ud af det, så smid lige løsningen herind. ;o)
Avatar billede webbe Nybegynder
12. april 2002 - 10:51 #18
Yeah - skal jeg nok....også selv om den måske blive temmelig hjemmebrygget. ;0)
Avatar billede webbe Nybegynder
12. april 2002 - 11:02 #19
Min teori holdt sq stik....her er løsningen:

<body bgcolor="#336699" text="#FFFFFF" link="#FFFFFF" vlink="#FFFFFF" alink="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "hardware"

sql1 = "SELECT * FROM Kategorier ORDER BY Navn ASC"
Set rs1 = Connect.Execute(sql1)
%>
<table border="0" cellpadding="0" cellspacing="10" width="675">
<%
do while not (rs1.bof or rs1.eof)
%>
    <tr>
        <td colspan="6" width="675">
            <font face="Arial" size="4">
                <%=rs1("Navn")%> oversigt
            </font>
        </td>
    </tr>
    <tr>
        <td width="125">
            <font face="Arial" size="2">
                <u>Mærke</u>
            </font>
        </td>
        <td width="125">
            <font face="Arial" size="2">
                <u>Model</u>
            </font>
        </td>
        <td width="175">
            <font face="Arial" size="2">
                <u>Serienr.</u>
            </font>
        </td>
        <td width="75">
            <font face="Arial" size="2">
                <u>På lager</u>
            </font>
        </td>
        <td width="50">
            <font face="Arial" size="2">
                <u>Antal</u>
            </font>
        </td>
        <td width="125" align="right">
            <font face="Arial" size="2">
           
            </font>
        </td>
    </tr>
    <%
    sql2 = "SELECT * FROM HardwareIndex WHERE Kategori="&rs1("Id")
    Set rs2 = Connect.Execute(sql2)

    Do while not (rs2.bof or rs2.eof)
    %>
    <tr>
        <td width="125">
            <font face="Arial" size="1">
                <%=rs2("Maerke")%>
            </font>
        </td>
        <td width="125">
            <font face="Arial" size="1">
                <%=rs2("Model")%>
            </font>
        </td>
        <td width="175">
            <font face="Arial" size="1">
                <%=rs2("Serienr")%>
            </font>
        </td>
        <td width="75">
            <font face="Arial" size="1">
                <%
                If rs2("Lagerstatus") = "on" Then
                    Response.Write("Ja")
                Else
                    Response.Write("Nej")
                End if
                %>
            </font>
        </td>
        <td width="50">
            <font face="Arial" size="1">
                <%=rs2("Antal")%> stk.
            </font>
        </td>
        <td width="125" align="right">
            <font face="Arial" size="1">
                <a href="edit.asp?id=<%=rs2("Id")%>">Ret</a> / <a href='java script:slet("<%=rs2("Id")%>")'>Slet</a>
            </font>
        </td>
    </tr>
    <%
    rs2.movenext
    loop
    %>
    <%
    rs1.movenext
    loop
    %>
</table>
</body>

Men I har begge to bidraget til min løsning så jeg deler pointene mellem jer.

thomas_yde: Gider du oprette et nyt svar?
Avatar billede thomas_yde Nybegynder
12. april 2002 - 11:06 #20
ja det kunne vi godt have sagt, men du ville have 1 record set :)
Avatar billede thomas_yde Nybegynder
12. april 2002 - 11:13 #21
men held og lykke med projektet
Avatar billede kelo Nybegynder
12. april 2002 - 11:21 #22
Var så lidt og tak for points.
Avatar billede torbenrohde Nybegynder
12. april 2002 - 13:33 #23
Du behøver kun 1 recordset, du kan bare sortere på kategori, og så have have en variabel der indeholder kategorien for det sidst udskrevne produkt. Hver gang du så støder på en ny kategori kan du så gøre et eller andet (fx udskrive en kategori overskrift).
Altså i "semi-pseudo-kode" :

dim productsRS
Set productsRS = myDbConnection.Execute("SELECT produkt_overskrift, [flere attributter], kategori_overskrift, kategori_id FROM produkter JOIN kategorier WHERE produkt_kategori_id = kategori_id ORDER BY kategori_overskrift")

dim lastCategoryId
lastCategoryId = productsRS("kategori_id")
Do While Not productsRS.EOF
    If lastCategoryId <> productsRS("kategori_id") Then
        Response.Write "<b>" & productsRS("kategori_overskrift") "</b><br>"
        lastCategoryId = productsRS("kategori_id")
    End If

    Response.Write productsRS("produkt_overskrift") & "<br>"
    productsRS.MoveNext
Loop
productsRS.Close
Set productsRS = Nothing
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