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