Sql server 在SQL中,我希望按顺序对记录进行分组

Sql server 在SQL中,我希望按顺序对记录进行分组,sql-server,Sql Server,我有如下所示的数据表。我添加了Insert查询以正确显示数据 现在我想按以下格式将它们按顺序分组,这样,如果数据不是递增的,并且缺少一些Issueno,我需要计数和范围 Tickets | Count | Status -----------------------+-------+----------------------------------- 100001809 | 1 | Void,Reissued,Trans

我有如下所示的数据表。我添加了Insert查询以正确显示数据

现在我想按以下格式将它们按顺序分组,这样,如果数据不是递增的,并且缺少一些
Issueno
,我需要计数和范围

Tickets                | Count | Status
-----------------------+-------+-----------------------------------    
100001809              |   1   | Void,Reissued,Transferred
100001810              |   1   | Valid Transferred
100001811-100001812    |   2   | Void,Reissued,Transferred
100001813-100001815    |   3   | Valid,Transferred
100001816-100002399    | 584   | Not issued
100002400-100002404    |   5   | Valid,Transferred
100002405-100002999    | 595   | Not issued
100003000              |   1   | Valid,Transferred
100003001              |   1   | Void,Reissued,Transferred
100003002-100003003    |   2   | Valid,Transferred
Voidstatus='VO'
表示它是无效的,如果为空则表示它是有效的,
Reissued='Y'
表示它是重新发行的,
transactionname='EXPORT'
表示已转让

分组的距离应确保每一行都将数据(前3列)与下一行进行比较,如果匹配,则形成一个组,否则形成另一个组

Issueno=100001809
与下一行不同,因此此表1分组

下一行有
Issueno=100001810
,这与下一行不同,因此形成另一个计数为1的分组

Issueno=100001811
与具有
Issueno=100001812
的下一行相同,因此此表1组的计数为2

请在下面找到插入查询

Create table Issue
(
    VoidStatus nvarchar(100),
    Reissued varchar(10),
    TransactionName varchar(100),  
    Issueno varchar(100)
)    

INSERT INTO Issue
    SELECT 'VO','Y' ,'EXPORT','100001809'
    UNION ALL
    SELECT NULL,NULL,'EXPORT','100001810'
    UNION ALL
    SELECT 'VO','Y','EXPORT','100001811'
    UNION ALL
    SELECT 'VO','Y','EXPORT','100001812'
    UNION ALL
    SELECT NULL, NULL, 'EXPORT', '100001813'
    UNION ALL
    SELECT NULL, NULL, 'EXPORT', '100001814'
    UNION ALL
    SELECT NULL, NULL, 'EXPORT', '100001815'  
    UNION ALL
    SELECT NULL, NULL, 'EXPORT', '100002400'
    UNION ALL

 SELECT NULL,NULL,'EXPORT','100002401'

    UNION ALL

 SELECT NULL,NULL,'EXPORT','100002402'

   UNION ALL

 SELECT NULL,NULL,'EXPORT','100002403'

    UNION ALL

 SELECT NULL,NULL,'EXPORT','100002404'

    UNION ALL

 SELECT NULL,NULL,'EXPORT','100003000'

    UNION ALL

 SELECT 'VO','Y','EXPORT','100003001'

   UNION ALL

 SELECT NULL,NULL,'EXPORT','100003002'

    UNION ALL

 SELECT NULL,NULL,'EXPORT','100003003'

我认为这里有太多的事情要做,一个插入到命令。您需要一个存储过程来运行记录并创建输出表。我不知道您使用的是什么数据库,但这里有一个Access解决方案。如果不使用Access,则可以稍微更改语法,使其适合所使用的任何存储过程语言

Sub CreateTickets()

    Dim RS As Recordset
    Dim Count As Long
    Dim FirstIssueNo As Long
    Dim IssueNo As Long
    Dim VoidStatus As String
    Dim Reissued As String
    Dim TransactionName As String
    Dim Value As String

    Count = 1
    IssueNo = 0
    FirstIssueNo = 0

    Set RS = CurrentDb.OpenRecordset("SELECT * FROM Issue ORDER BY IssueNo")
    If RS.BOF = False Then
        While RS.EOF = False
            If IssueNo <> 0 And ( _
                CLng(RS("Issueno")) <> IssueNo + 1 Or "" & RS("VoidStatus") <> VoidStatus Or "" & RS("ReIssued") <> Reissued Or "" & RS("TransactionName") <> TransactionName) Then

                Value = IIf(VoidStatus <> "", "Void,", "") & IIf(Reissued <> "", "Reissued,", "") & IIf(TransactionName <> "", IIf(VoidStatus = "", "Valid,", "") & "Transferred", "")
                If FirstIssueNo <> 0 And FirstIssueNo <> IssueNo Then
                    Ticket = FirstIssueNo & "-" & IssueNo
                    Debug.Print Ticket & " | " & Count & " | " & Value
                    CurrentDb.Execute ("INSERT INTO Ticket (Tickets,[Count],Status) VALUES (""" & Ticket & """," & Count & ",""" & Value & """);")
                Else
                    Ticket = IssueNo
                    Debug.Print Ticket & " | " & Count & " | " & IIf(VoidStatus <> "", "Void,", "") & IIf(Reissued <> "", "Reissued,", "") & IIf(TransactionName <> "", IIf(VoidStatus = "", "Valid,", "") & "Transferred", "")
                    CurrentDb.Execute ("INSERT INTO Ticket (Tickets,[Count],Status) VALUES (""" & Ticket & """," & Count & ",""" & Value & """);")
                End If
                If CLng(RS("IssueNo")) <> IssueNo + 1 Then
                    Value = "Not Issued"
                    Count = (CLng(RS("IssueNo")) - IssueNo - 1)
                    If (IssueNo + 1) <> (CLng(RS("IssueNo")) - 1) Then
                        Ticket = (IssueNo + 1) & "-" & (CLng(RS("IssueNo")) - 1)
                        Debug.Print Ticket & " | " & Count & " | " & Value
                        CurrentDb.Execute ("INSERT INTO Ticket (Tickets,[Count],Status) VALUES (""" & Ticket & """," & Count & ",""" & Value & """);")
                    Else
                        Ticket = (IssueNo + 1)
                        Debug.Print Ticket & " | " & Count & " | " & Value
                        CurrentDb.Execute ("INSERT INTO Ticket (Tickets,[Count],Status) VALUES (""" & Ticket & """," & Count & ",""" & Value & """);")
                    End If
                End If
                FirstIssueNo = CLng(RS("IssueNo"))
                Count = 1
            Else
                Count = Count + 1
            End If

            IssueNo = CLng(RS("Issueno"))
            VoidStatus = "" & RS("VoidStatus")
            Reissued = "" & RS("ReIssued")
            TransactionName = "" & RS("TransactionName")

            RS.MoveNext
        Wend

        Value = IIf(VoidStatus <> "", "Void,", "") & IIf(Reissued <> "", "Reissued,", "") & IIf(TransactionName <> "", IIf(VoidStatus = "", "Valid,", "") & "Transferred", "")
        If FirstIssueNo <> 0 And FirstIssueNo <> IssueNo Then
            Ticket = FirstIssueNo & "-" & IssueNo
            Debug.Print Ticket & " | " & Count & " | " & Value
            CurrentDb.Execute ("INSERT INTO Ticket (Tickets,[Count],Status) VALUES (""" & Ticket & """," & Count & ",""" & Value & """);")
        Else
            Ticket = IssueNo
            Debug.Print Ticket & " | " & Count & " | " & IIf(VoidStatus <> "", "Void,", "") & IIf(Reissued <> "", "Reissued,", "") & IIf(TransactionName <> "", IIf(VoidStatus = "", "Valid,", "") & "Transferred", "")
            CurrentDb.Execute ("INSERT INTO Ticket (Tickets,[Count],Status) VALUES (""" & Ticket & """," & Count & ",""" & Value & """);")
        End If
    End If
End Sub
Sub-CreateTickets()
将遥感器作为记录集
不算长
第一个问题是什么
我的名字和你的一样长
将状态设置为字符串
作为字符串重新发布
Dim TransactionName作为字符串
将值设置为字符串
计数=1
IssueNo=0
FirstIssueNo=0
Set RS=CurrentDb.OpenRecordset(“按IssueNo从出库单中选择*)
如果RS.BOF=假,则
而RS.EOF=False
如果发布0和(_
CLng(RS(“发行”)发行+1或“&RS(“作废状态”)作废状态或“&RS(“重新发行”)重新发行或“&RS(“交易名称”)交易名称),然后
值=IIf(无效状态)、“无效”、“重新发布”、“重新发布”、“重新发布”、“重新发布”和IIf(交易名称)、IIf(无效状态=“”、“有效”、“已转移”、“已转移”)
如果FirstIssueNo 0和FirstIssueNo IssueNo,则
票证=FirstIssueNo&“-”和IssueNo
调试。打印票据&“|”&计数&“|”&值
CurrentDb.Execute(“插入票证(票证,[Count],状态)值(“&Ticket&”、“&Count&”、“&Value&”)
其他的
票证
调试。打印票据和“|”&计数和“|”&IIf(作废状态“,”作废“,”)&IIf(重新发行“,”重新发行“,”)&IIf(交易名称“,”作废状态“,”有效“,”已转移“,”)
CurrentDb.Execute(“插入票证(票证,[Count],状态)值(“&Ticket&”、“&Count&”、“&Value&”)
如果结束
如果CLng(RS(“发行”)发行+1,则
Value=“未发布”
计数=(CLng(RS(“IssueNo”))-IssueNo-1)
如果(发行号+1)(CLng(RS)(“发行号”)-1),则
票证=(发行号+1)和“-”和(发行号-1)
调试。打印票据&“|”&计数&“|”&值
CurrentDb.Execute(“插入票证(票证,[Count],状态)值(“&Ticket&”、“&Count&”、“&Value&”)
其他的
票证=(发行号+1)
调试。打印票据&“|”&计数&“|”&值
CurrentDb.Execute(“插入票证(票证,[Count],状态)值(“&Ticket&”、“&Count&”、“&Value&”)
如果结束
如果结束
FirstIssueNo=CLng(卢比(“IssueNo”))
计数=1
其他的
计数=计数+1
如果结束
IssueNo=CLng(卢比(“IssueNo”))
VoidStatus=“”&RS(“VoidStatus”)
重新发行=”“&RS(“重新发行”)
TransactionName=”“&RS(“TransactionName”)
下一个
温德
值=IIf(无效状态)、“无效”、“重新发布”、“重新发布”、“重新发布”、“重新发布”和IIf(交易名称)、IIf(无效状态=“”、“有效”、“已转移”、“已转移”)
如果FirstIssueNo 0和FirstIssueNo IssueNo,则
票证=FirstIssueNo&“-”和IssueNo
调试。打印票据&“|”&计数&“|”&值
CurrentDb.Execute(“插入票证(票证,[Count],状态)值(“&Ticket&”、“&Count&”、“&Value&”)
其他的
票证
调试。打印票据和“|”&计数和“|”&IIf(作废状态“,”作废“,”)&IIf(重新发行“,”重新发行“,”)&IIf(交易名称“,”作废状态“,”有效“,”已转移“,”)
CurrentDb.Execute(“插入票证(票证,[Count],状态)值(“&Ticket&”、“&Count&”、“&Value&”)
如果结束
如果结束
端接头

您应该澄清您的问题。另外,scond图像显示了一个包含多个条目的列,对于您的状态类型,您应该每个列使用一列,或者每个行使用一行。我已经做了一些降价编辑,但主体是你们的,不是很清楚。请不要发布链接到截图或数据;把数据放在你的问题里。链接过期,无法通过SO搜索找到。您好,我已经更新了问题,请告诉我它是否不清楚这是用于哪个RDBMS的?请添加一个标记,以指定您使用的是
mysql
postgresql
sql-server
oracle
还是
db2
——还是其他什么。根据屏幕截图,我几乎可以肯定这是sql server管理工具