Link to home
Start Free TrialLog in
Avatar of Kevin Willyerd
Kevin WillyerdFlag for United States of America

asked on

Sequentially number sub set query

I have a POS system that has a table named "History" that logs information on each sale. It is not totally normalized. It has a [Transaction] field and a [product code] field. There can be 1 to many records with the same [Transaction]. I need to create a query that will create a number for each record that starts at 1 for each unique [transaction] value and increments for each additional record with the same transaction.

Example sample data:

Transaction         Product code
1                            bell
1                            swing
1                            food
2                            crickets
3                            food
3                            food

Desired Output:

Transaction         Product code      LineNum
1                            bell                        1
1                            swing                    2
1                            food                     3
2                            crickets                1
3                            food                     1
3                            food                     2

Is there a simple query that can do this?
Avatar of Jeffrey Coachman
Jeffrey Coachman
Flag of United States of America image

1. <It is not totally normalized. >
Then why not normalize it...?

2. Why do these two records have the same LineNum?:
2                            crickets                1
3                            food                     1

3. In a larger since this would be made easier to "manipulate" if you had defined primary key fields in your table...
try this query,

btw, do you have an autonumber id field?

select Transaction,[Product code], (select count(*) from History as H where H.Transaction=History.Transaction) as LineNum
from History
Order by History.transaction
Avatar of Kevin Willyerd

ASKER

1) The program I run is compiled code and i can not change it. I can only make fixes because I have back door access to the data.

2) the two records have the same linenum because they are different transactions. think of linenum as a subtable key embedded in a flat file.

3) that is essentially what i am creating
The function RowCounter is exactly for this and very fast too.
Study the in-line comments for typical usage.
Also not that parameters are strings. No problem for your product code but the ID may need to be wrapped as shown in CStr:

Public Function RowCounter( _
  ByVal strKey As String, _
  ByVal booReset As Boolean, _
  Optional ByVal strGroupKey As String) _
  As Long
  
' Builds consecutive RowIDs in select, append or create query
' with the possibility of automatic reset.
' Optionally a grouping key can be passed to reset the row count
' for every group key.
'
' Usage (typical select query):
'   SELECT RowCounter(CStr([ID]),False) AS RowID, *
'   FROM tblSomeTable
'   WHERE (RowCounter(CStr([ID]),False) <> RowCounter("",True));
'
' Usage (with group key):
'   SELECT RowCounter(CStr([ID]),False,CStr[GroupID])) AS RowID, *
'   FROM tblSomeTable
'   WHERE (RowCounter(CStr([ID]),False) <> RowCounter("",True));
'
' The Where statement resets the counter when the query is run
' and is needed for browsing a select query.
'
' Usage (typical append query, manual reset):
' 1. Reset counter manually:
'   Call RowCounter(vbNullString, False)
' 2. Run query:
'   INSERT INTO tblTemp ( RowID )
'   SELECT RowCounter(CStr([ID]),False) AS RowID, *
'   FROM tblSomeTable;
'
' Usage (typical append query, automatic reset):
'   INSERT INTO tblTemp ( RowID )
'   SELECT RowCounter(CStr([ID]),False) AS RowID, *
'   FROM tblSomeTable
'   WHERE (RowCounter("",True)=0);
'
' 2002-04-13. Cactus Data ApS. CPH
' 2002-09-09. Str() sometimes fails. Replaced with CStr().
' 2005-10-21. Str(col.Count + 1) reduced to col.Count + 1.
' 2008-02-27. Optional group parameter added.
' 2010-08-04. Corrected that group key missed first row in group.

  Static col      As New Collection
  Static strGroup As String
  
  On Error GoTo Err_RowCounter
  
  If booReset = True Then
    Set col = Nothing
  ElseIf strGroup <> strGroupKey Then
    Set col = Nothing
    strGroup = strGroupKey
    col.Add 1, strKey
  Else
    col.Add col.Count + 1, strKey
  End If
  
  RowCounter = col(strKey)
  
Exit_RowCounter:
  Exit Function
  
Err_RowCounter:
  Select Case Err
    Case 457
      ' Key is present.
      Resume Next
    Case Else
      ' Some other error.
      Resume Exit_RowCounter
  End Select

End Function

Open in new window

/gustav
ASKER CERTIFIED SOLUTION
Avatar of Rey Obrero (Capricorn1)
Rey Obrero (Capricorn1)
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
capricorn1

the query is giving me the count of number records each transaction has not an ordinal number.

results are like:
Transaction         Product code      LineNum
1                            bell                        3
1                            swing                    3
1                            food                    3
2                            crickets                1
3                            food                     2
3                            food                     2
PetGuy,

did you see my last post?





.
capricorn1

History does not have an ID field
too bad..

can you import the records to an access table, then create an autonumber field?
The table is in access. I can add fields without breaking the original program. I will add an auto id field.
Thanks so much for the help