Solved

Sequentially number sub set query

Posted on 2013-02-05
11
455 Views
Last Modified: 2013-02-05
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?
0
Comment
Question by:PetGuy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
11 Comments
 
LVL 74

Expert Comment

by:Jeffrey Coachman
ID: 38855769
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...
0
 
LVL 120

Expert Comment

by:Rey Obrero (Capricorn1)
ID: 38855836
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
0
 

Author Comment

by:PetGuy
ID: 38855852
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
0
Ransomware: The New Cyber Threat & How to Stop It

This infographic explains ransomware, type of malware that blocks access to your files or your systems and holds them hostage until a ransom is paid. It also examines the different types of ransomware and explains what you can do to thwart this sinister online threat.  

 
LVL 50

Expert Comment

by:Gustav Brock
ID: 38855858
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
0
 
LVL 120

Accepted Solution

by:
Rey Obrero (Capricorn1) earned 500 total points
ID: 38855867
btw, do you have an autonumber id field?

select Transaction,[Product code], (select count(*) from History as H where H.Transaction=History.Transaction and H.id>=History.ID) as LineNum
from History
Order by History.transaction
0
 

Author Comment

by:PetGuy
ID: 38855911
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
0
 
LVL 120

Expert Comment

by:Rey Obrero (Capricorn1)
ID: 38855930
PetGuy,

did you see my last post?





.
0
 

Author Comment

by:PetGuy
ID: 38856030
capricorn1

History does not have an ID field
0
 
LVL 120

Expert Comment

by:Rey Obrero (Capricorn1)
ID: 38856043
too bad..

can you import the records to an access table, then create an autonumber field?
0
 

Author Comment

by:PetGuy
ID: 38856116
The table is in access. I can add fields without breaking the original program. I will add an auto id field.
0
 

Author Closing Comment

by:PetGuy
ID: 38856414
Thanks so much for the help
0

Featured Post

Turn Insights into Action

Communication across every corner of your business is essential to increase the velocity of your application delivery and support pipeline. Automate, standardize, and contextualize your communication processes with xMatters.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This post looks at MongoDB and MySQL, and covers high-level MongoDB strengths, weaknesses, features, and uses from the perspective of an SQL user.
In part one, we reviewed the prerequisites required for installing SQL Server vNext. In this part we will explore how to install Microsoft's SQL Server on Ubuntu 16.04.
Familiarize people with the process of retrieving data from SQL Server using an Access pass-thru query. Microsoft Access is a very powerful client/server development tool. One of the ways that you can retrieve data from a SQL Server is by using a pa…
What’s inside an Access Desktop Database. Will look at the basic interface, Navigation Pane (Database Container), Tables, Queries, Forms, Report, Macro’s, and VBA code.

695 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question