Avatar billede michaelfp Nybegynder
06. september 2004 - 21:17 Der er 13 kommentarer og
1 løsning

Hjælp til sql statement (hvordan refereres) og pivot

Hej eksperter,

I mit asp script får jeg følgende værdier ind i recordsettet Rs1, med følgende kode:

Rs1 = conn.Execute(StrSQL)

Konsulentid  Navn  Status  Antal
NR            NR    1        20
NR            NR    3        212
MP            MP    2        110
MP            MP    4        2
MP            MP    1        51

Nu vil jeg køre en ny sqlstatement, som bruger værdierne fra Rs1, men er i tvivl om, hvordan jeg referere og om jeg overhovedet kan dette.

Som en access forespørgsel ville det se således ud:

TRANSFORM Sum([rs1].Antal) AS SumOfAntal
SELECT [rs1].Navn, Sum([ras1].Antal) AS [I alt l]
FROM [rs1]
GROUP BY [rs1].Navn
PIVOT Konverteretstatus([status]);

Konverteretstatus er en funktion som findes på siden.

Hvordan referere jeg til rs1 recordsettet og hvordan referere
jeg til funktionen inde i sql statementet?

På forhånd tak.
Avatar billede eagleeye Praktikant
06. september 2004 - 22:10 #1
hvor er funktionen Konverteretstatus?

Der er ikke noget problem i at lave det med et recodset. Du får så X antal kolonne som kommer fra funktionen.

men du kan udksrive alt fra recordset sådan her:

SQL = "SELECT * FROM tabelnavn"
Set rs = Conn.Execute(SQL)

Response.Write "<table>"
'Udskriv kolonnenavne
if not rs.EOF then
  Response.Write "<tr>"
  for each f in rs.Fields
    Response.Write "<td>" & f.name & "</td>"
  next
  Response.Write "</tr>"
end if
'Udskriv indhold af kolonnerne
Response.Write "<tr><td>"
Response.Write rs.GetString (, -1, "</tr><td>", "</td></tr><tr><td>", NBSPACE) 
response.write "</table>"
Avatar billede michaelfp Nybegynder
06. september 2004 - 22:17 #2
Hej Eagleeye,
Måske har jeg ikke formuleret mig klart nok og det beklager jeg!

Her er koden (komplet borset fra html tags)

  Function Konverteretstatus(id)
    Dim Nystatus
    Nyststaus = ""
    Select Case Id
      Case 7: Nystatus = "Aktiv-skal aktiveres"
      Case 4,5,6: Nystatus = "Aktiv-ér aktiveret"
      Case 13: Nystatus = "I job"
      Case 14,15,16,17: Nystatus = "Afsluttet"
      Case 8,9,10: Nystatus = "Aktiv-20T/Suppl.dp"
      Case 1,2: Nystatus = "Ny henvist"
      Case 3: Nystatus = "Aktiv i rådgivning"
    End select
    Konverteretstatus = Nystatus
  End function

Dim rs1,rs2,StrSQL,X



  Opendatabase
  Set rs1 = Server.CreateObject("ADODB.Recordset")
  Set rs2 = Server.CreateObject("ADODB.Recordset")




  StrSQL = "SELECT [SKonsulenter].KonsulentId, [SKonsulenter].Navn, [Skandidater].Status, Count([Skandidater].Navn) AS Antal"
  StrSQL = StrSQL & " FROM ([SKonsulenter] LEFT JOIN [Skandidater] ON [SKonsulenter].KonsulentId = [Skandidater].Konsulent)"
  StrSQL = StrSQL & " GROUP BY [SKonsulenter].KonsulentId, [SKonsulenter].Navn, [Skandidater].Status"
  Set rs1 = Conn.Execute(strSQL) 

  StrSQL = "TRANSFORM Sum(" & Rs1("Antal") & ") AS SumOfAntal"
  StrSQL = StrSQL & " SELECT " & Rs1("Navn") & ", Sum(" & Rs1("Antal") & ") AS [I alt l]"
  StrSQL = StrSQL & "FROM " & <%Rs1%> & " GROUP BY " & Rs1("Navn") & " PIVOT " & Konverteretstatus(Rs1("Status")) & ")"




  response.write StrSql
  Set rs2 = Conn.Execute(StrSQL)



  If Not Rs2.EOF and not Rs2.BOF Then
    Response.write "<Table border=1>"
    Response.Write "<Tr>"
    For X = 0 to Rs2.Fields.count - 1
      Response.write "<Td>" & Rs2.Fields.Item(x).Name & "</td>"
    Next
    Response.write "</Tr>"
    Rs2.Movefirst
    While not Rs2.Eof
      Response.Write "<Tr>"
      For X = 0 To Rs2.Fields.Count - 1
        Response.write "<Td>" & Rs2.Fields.Item(X).Value
      Next
      Rs2.Movenext
      Response.write "</Tr>"
    Wend
    Response.Write "</Table>"
  End if

Rs1 hentes fint og skrives fint ud. Mit problem er sqlstatement til rs2. Jeg er i tvivl om, hvordan jeg referere til rs1, som jo er den rs2 bygger på!
Avatar billede michaelfp Nybegynder
06. september 2004 - 23:11 #3
Hvad gør jeg forkert?

  StrSQL = "TRANSFORM Sum(" & Rs1("Antal") & ") AS SumOfAntal"
  StrSQL = StrSQL & " SELECT '" & Rs1("Navn") & "', Sum(" & Rs1("Antal") & ") AS [I alt l]"
  StrSQL = StrSQL & " FROM "' & Rs1 & '" GROUP BY " & Rs1("Navn") & " PIVOT " & Konverteretstatus(Rs1("Status")) & ")"

Jeg får fejl: Syntax error in FROM clause.
Avatar billede eagleeye Praktikant
06. september 2004 - 23:14 #4
Der er noget galt i denne linje:

StrSQL = StrSQL & " FROM "' & Rs1 & '" GROUP BY " & Rs1("Navn") & " PIVOT " & Konverteretstatus(Rs1("Status")) & ")"


Dels skal der ikke være ' omkring tabelnavnet. Samt man kan ikke skrive rs1 uden kolonne angivelse.

StrSQL = StrSQL & " FROM " & Rs1("XXX") & " GROUP BY " & Rs1("Navn") & " PIVOT " & Konverteretstatus(Rs1("Status")) & ")"

Du bliver nok nød til at skrive tabelnavnet igen

StrSQL = StrSQL & " FROM SKonsulenter GROUP BY " & Rs1("Navn") & " PIVOT " & Konverteretstatus(Rs1("Status")) & ")"
Avatar billede michaelfp Nybegynder
06. september 2004 - 23:21 #5
Jeg forstår ikke, hvad du mener!
RS1 er Set rs1 = Conn.Execute(strSQL)  (se koden ovenfor)
så hvad skal jeg skrive i parantesen det er jo navnet på tabellen jeg
skulle have brugt, hvis ellers det var en tabel fra databasen!?
Avatar billede eagleeye Praktikant
06. september 2004 - 23:21 #6
men du kan ikke få data fra recordete rs1 ind i SQL'en til nr. 2. Den vil tage indholdet af en kolonne når man skriver rs("navn") det betyder ikke den overføre alle data fra kolonne rs("navn").
Avatar billede michaelfp Nybegynder
06. september 2004 - 23:24 #7
Vil det sige at jeg blot skal tage en af kolonnenavnene og skrive i parantesen i dit forslag?
Avatar billede eagleeye Praktikant
06. september 2004 - 23:31 #8
Ja de skal stå kolonnenavne. Men jeg forstår ikke helt hvad du vil havde?
Avatar billede michaelfp Nybegynder
06. september 2004 - 23:40 #9
Eagleeye jeg er sikker på du kan hjælpe - så jeg forklarer mig igen:

med
Set rs1 = Conn.Execute(strSQL) 
henter jeg summerede data fra databasen.

Disse data vil jeg gerne have opdelt i en krydstabulering/crosstab, udfra værdien i feltet status.
Output skulle være a la:

    Nye  gamle  andet  andet
MFP  22    1              54
NR  112          44      22

Inddelingen i nye, gamle, andet, andet sker i funktionen konverteretstatus.
Dette output er det jeg forsøger at danne med den anden sqlstatement.

Giver det mening?
Avatar billede eagleeye Praktikant
07. september 2004 - 00:02 #10
Jeg er lidt lost her men måske det bliver noget i stil med:

  StrSQL = "TRANSFORM Sum(Antal) AS SumOfAntal"
  StrSQL = StrSQL & "SELECT [SKonsulenter].KonsulentId, [SKonsulenter].Navn, [Skandidater].Status, Count([Skandidater].Navn) AS Antal"
  StrSQL = StrSQL & " FROM ([SKonsulenter] LEFT JOIN [Skandidater] ON [SKonsulenter].KonsulentId = [Skandidater].Konsulent)"
  StrSQL = StrSQL & " GROUP BY [SKonsulenter].KonsulentId, [SKonsulenter].Navn, [Skandidater].Status PIVIOT " & Konverteretstatus(Rs1("Status"))
Avatar billede michaelfp Nybegynder
07. september 2004 - 00:19 #11
Du er skrap!

Jeg var selv nået frem til følgende nye sqlstatement:

    StrSQL = "TRANSFORM Count(Skandidater.Navn) AS Antal"
    StrSQL = StrSQL & " SELECT SKonsulenter.KonsulentId, SKonsulenter.Navn"
    StrSQL = StrSQL & " FROM SKonsulenter LEFT JOIN Skandidater ON SKonsulenter.KonsulentId = Skandidater.Konsulent"
    StrSQL = StrSQL & " GROUP BY SKonsulenter.KonsulentId, SKonsulenter.Navn PIVOT Skandidater.Status"

Men den giver følgende fejl:

Microsoft JET Database Engine error '80004005'
Operation is not supported for this type of object.

/crm/logistik1.asp, line 82

73  If Not Rs2.EOF and not Rs2.BOF Then
74    Response.write "<Table border=1>"
75    Response.Write "<Tr>"
76    For X = 0 to Rs2.Fields.count - 1
78      Response.write "<Td>" & Rs2.Fields.Item(x).Name & "</td>"
79    Next
80    Response.write "</Tr>"
81    Rs2.Movefirst
82    While not Rs2.Eof
83      Response.Write "<Tr>"
84      For X = 0 To Rs2.Fields.Count - 1
85        Response.write "<Td>" & Rs2.Fields.Item(X).Value
86      Next
87      Rs2.Movenext
88      Response.write "</Tr>"
89    Wend
90    Response.Write "</Table>"
91  End if


Hvad er det, som ikke er supported?
Avatar billede eagleeye Praktikant
07. september 2004 - 00:21 #12
Har du åbnet rs2 ?

set rs2=Conn.Execute(strSQL)
Avatar billede michaelfp Nybegynder
07. september 2004 - 00:24 #13
Ja - det er åbenbart rs2.movefirst, den fejler på! Ved at fjerne den,
køre forespørgslen.  Jeg ved ikke hvorfor.
Du skal have point. tak endnu en gang for din hjælp.
Send lige et svar.
Avatar billede eagleeye Praktikant
07. september 2004 - 00:28 #14
Ok :)
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