[AccessD] SQL Server Pivot

A.D.Tejpal adtp at airtelbroadband.in
Sun Feb 3 13:05:51 CST 2008


John,

    The requirement presented by you would involve crosstab flip flop. Generic sample subroutine named P_MakeAndShowQryFlipFlop(), as given below, transforms table contents from cross tab to normal and then back to new version of crosstab. The results are displayed in programmatically built query "Q_FlipFlop"

    The subroutine needs two arguments as follows:
    (a) Name of table
    (b) Ordinal position of first field storing age codes.
          (Imp: It is to be ensured that all fields thereafter are only those with age codes)

    For example, if the data table is named T_Age and AgeCodes are stored in second field onwards, the subroutine will be called as per following statement:

    P_MakeAndShowQryFlipFlop "T_Age", 2

    With this call, the query "Q_FlipFlop" will get built programmatically, duly taking into account the up-to-date contents of data table. It takes care of any variations in number of columns meant for holding AgeCodes and final results are in four column format (AgeGroup, Count of Code 1, Count of Code 2, Count of Code 3) as sought by you.

    Note - Suggested line of action is based upon tests conducted on Access 2003 desktop (Access 2000 file format). This has to be kept in view while adapting to SQL server.

Best wishes,
A.D.Tejpal
------------

' Crosstab FlipFlop Query (named Q_FlipFlop)
' Sample subroutine for building the query
' and displaying its results
'======================================
Sub P_MakeAndShowQryFlipFlop( _
                    TableName As String, _
                    PosOfFirstAgeGrpField As Long)
    ' Transforms table contents from cross tab
    ' to normal and then back to new version
    ' of crosstab. The results are displayed in
    ' prgrammatically built query "Q_FlipFlop"
    On Error Resume Next
    Dim db As DAO.Database
    Dim tdf As TableDef

    Dim Qst As String, Cnt As Long
    Dim Fnm As String

    Set db = CurrentDb
    Set tdf = db.TableDefs(TableName)
    
    Qst = "TRANSFORM Count(Q1.GrpCode) AS " & _
            "CodeCount " & _
            "SELECT Q1.AgeGrp FROM ["
            
    For Cnt = PosOfFirstAgeGrpField - 1 To tdf.Fields.Count - 1
        Qst = Qst & IIf(Cnt > PosOfFirstAgeGrpField - 1, _
                " UNION ALL ", "")
        Fnm = tdf.Fields(Cnt).Name
        Qst = Qst & "SELECT " & Chr(39) & Fnm & _
                Chr(39) & " AS AgeGrp, " & Fnm & _
                " AS GrpCode FROM " & TableName
    Next
    
    Qst = Qst & "]. AS Q1 " & _
            "WHERE Not IsNull(Q1.GrpCode) " & _
            "GROUP BY Q1.AgeGrp " & _
            "PIVOT 'C_' & Q1.[GrpCode];"
    
    ' Delete target query if already existing
    ' and then re-create the same as per above SQL
    DoCmd.DeleteObject acQuery, "Q_FlipFlop"
    db.CreateQueryDef "Q_FlipFlop", Qst
    db.QueryDefs.Refresh
    
    ' Display results
    DoCmd.OpenQuery "Q_FlipFlop"
    
    Set tdf = Nothing
    Set db = Nothing
    On Error GoTo 0
End Sub
'======================================

  ----- Original Message ----- 
  From: jwcolby 
  To: 'Access Developers discussion and problem solving' ; 'Discussion concerning MS SQL Server' 
  Sent: Saturday, February 02, 2008 22:17
  Subject: [AccessD] SQL Server Pivot


  I have a bunch of columns that break out ages into bands.  For example:

  Presence_of_adults_age_65_74_specific
  Presence_of_adults_age_55_64_specific
  Presence_of_adults_age_45_54_specific
  etc

  Each column has codes 1,2,3

  I need counts of each column, for each value

  column Cnt1 Cnt2 Cnt3
  65_74 45 3 23
  55_64 103 48 211
  45_54 20 1 49

  etc

  I think the Pivot statement is going to do that for me but I can't seem to
  wrap my mind around the syntax.  Can anyone point me to a web page that
  clearly explains this or simply write a SQL statement that does this?

  Thanks

  John W. Colby
  Colby Consulting
  www.ColbyConsulting.com 


More information about the AccessD mailing list