Sql server 用破折号在同一数字中查找最新条目?

Sql server 用破折号在同一数字中查找最新条目?,sql-server,Sql Server,我们有一个表,其中存储了我们发出的所有报价的列表 每当客户修改报价时,系统会根据上次使用的编号自动附加-1或-2 例如 原报价编号:24545 客户要求修改,报价编号现在是24545-1,在发送报价后,我们现在再次进行修改,报价是24545-2,依此类推 我想运行一个SQL查询,显示他们的前20个引号,如果有修订,它应该显示最新的修订 你能帮帮我吗 我已经写了一个查询,将给我带来过去10天的前20名报价 SELECT Top 20 EstimateNumber,CustNam

我们有一个表,其中存储了我们发出的所有报价的列表

每当客户修改报价时,系统会根据上次使用的编号自动附加-1或-2

例如

原报价编号:24545

客户要求修改,报价编号现在是24545-1,在发送报价后,我们现在再次进行修改,报价是24545-2,依此类推

我想运行一个SQL查询,显示他们的前20个引号,如果有修订,它应该显示最新的修订

你能帮帮我吗

我已经写了一个查询,将给我带来过去10天的前20名报价

SELECT Top 20
          EstimateNumber,CustName,JobDescription,TotalSellPrice,EstimateStatus,EstimateDate,CommissionTableA
          FROM [Enterprise32].[dbo].[tablename1]
          where EstimateDate BETWEEN DATEADD(Day, -10, getdate()) AND GETDATE() AND SalesRepCode = $id And TotalSellPrice > '5000' AND EstimateStatus = 'P'
          Order By TotalSellPrice DESC

这有一些假设,但我认为这可能是可行的。否则,样本数据和预期结果将非常宝贵:

USE Enterprise32;
GO
WITH CTE AS(
    SELECT V.EstimateNumber,
           V.RevisionNumber,
           TN1.CustName,
           TN1.JobDescription,
           TN1.TotalSellPrice,
           TN1.EstimateStatus,
           TN1.EstimateDate,
           TN1.CommissionTableA,
           ROW_NUMBER() OVER (PARTITION BY V.EstimateNumber ORDER BY V.RevisionNumber DESC) AS RN
    FROM dbo.TableName1 TN1
         CROSS APPLY (VALUES(NULLIF(CHARINDEX('-',TN1.EstimateNumber),0)))CI(I)
         CROSS APPLY (VALUES(TRY_CONVERT(int,LEFT(TN1.EstimateNumber,ISNULL(CI.I,LEN(TN1.EstimateNumber))-1)),ISNULL(TRY_CONVERT(int,STUFF(TN1.EstimateNumber,1,CI.I,'')),0)))V(EstimateNumber,RevisionNumber)
    WHERE TN1.EstimateDate BETWEEN DATEADD(Day, -10, getdate()) AND GETDATE()
      AND TN1.SalesRepCode = $id
      And TN1.TotalSellPrice > '5000'
      AND TN1.EstimateStatus = 'P')
SELECT TOP (20)
       EstimateNumber,
       RevisionNumber,
       CustName,
       JobDescription,
       TotalSellPrice,
       EstimateStatus,
       EstimateDate,
       CommissionTableA
FROM CTE
WHERE RN = 1;

这有一些假设,但我认为这可能是可行的。否则,样本数据和预期结果将非常宝贵:

USE Enterprise32;
GO
WITH CTE AS(
    SELECT V.EstimateNumber,
           V.RevisionNumber,
           TN1.CustName,
           TN1.JobDescription,
           TN1.TotalSellPrice,
           TN1.EstimateStatus,
           TN1.EstimateDate,
           TN1.CommissionTableA,
           ROW_NUMBER() OVER (PARTITION BY V.EstimateNumber ORDER BY V.RevisionNumber DESC) AS RN
    FROM dbo.TableName1 TN1
         CROSS APPLY (VALUES(NULLIF(CHARINDEX('-',TN1.EstimateNumber),0)))CI(I)
         CROSS APPLY (VALUES(TRY_CONVERT(int,LEFT(TN1.EstimateNumber,ISNULL(CI.I,LEN(TN1.EstimateNumber))-1)),ISNULL(TRY_CONVERT(int,STUFF(TN1.EstimateNumber,1,CI.I,'')),0)))V(EstimateNumber,RevisionNumber)
    WHERE TN1.EstimateDate BETWEEN DATEADD(Day, -10, getdate()) AND GETDATE()
      AND TN1.SalesRepCode = $id
      And TN1.TotalSellPrice > '5000'
      AND TN1.EstimateStatus = 'P')
SELECT TOP (20)
       EstimateNumber,
       RevisionNumber,
       CustName,
       JobDescription,
       TotalSellPrice,
       EstimateStatus,
       EstimateDate,
       CommissionTableA
FROM CTE
WHERE RN = 1;

通过一些小的更改,它可能会起作用,因为没有数据示例:

SELECT Top 20
    EstimateNumber,CustName,JobDescription,TotalSellPrice,EstimateStatus,EstimateDate,CommissionTableA

FROM [dbo].[tablename1] tt
    LEFT JOIN
    (
--Top 20 quotes Last EstimateNumber with revision
        SELECT T20.RevisionFree_EstimateNumber + 
            CONVERT(VARCHAR,
                MAX(CONVERT(INT, 
                    SUBSTRING(t.EstimateNumber, CHARINDEX('-', EstimateNumber)+1, LEN(EstimateNumber)-CHARINDEX('-', EstimateNumber))))) Last_EstimateNumber 
        FROM
        (
--Top 20 quotes Original EstimateNumber
            SELECT DISTINCT Top 20
                 TotalSellPrice

                ,SUBSTRING(EstimateNumber, 1, CHARINDEX('-', EstimateNumber)) RevisionFree_EstimateNumber

            FROM [dbo].[tablename1]
            where EstimateDate BETWEEN DATEADD(Day, -10, getdate()) AND GETDATE() And TotalSellPrice > '5000' AND EstimateStatus = 'P'
            Order By TotalSellPrice DESC
        )AS T20

        LEFT JOIN 
        (
            SELECT *, SUBSTRING(EstimateNumber, 1, CHARINDEX('-', EstimateNumber)) RevisionFree_EstimateNumber 
            FROM [dbo].[tablename1]
        ) t
            ON T20.RevisionFree_EstimateNumber = t.RevisionFree_EstimateNumber
        GROUP BY T20.RevisionFree_EstimateNumber
    )LastEN
        ON tt.EstimateNumber = LastEN.Last_EstimateNumber

通过一些小的更改,它可能会起作用,因为没有数据示例:

SELECT Top 20
    EstimateNumber,CustName,JobDescription,TotalSellPrice,EstimateStatus,EstimateDate,CommissionTableA

FROM [dbo].[tablename1] tt
    LEFT JOIN
    (
--Top 20 quotes Last EstimateNumber with revision
        SELECT T20.RevisionFree_EstimateNumber + 
            CONVERT(VARCHAR,
                MAX(CONVERT(INT, 
                    SUBSTRING(t.EstimateNumber, CHARINDEX('-', EstimateNumber)+1, LEN(EstimateNumber)-CHARINDEX('-', EstimateNumber))))) Last_EstimateNumber 
        FROM
        (
--Top 20 quotes Original EstimateNumber
            SELECT DISTINCT Top 20
                 TotalSellPrice

                ,SUBSTRING(EstimateNumber, 1, CHARINDEX('-', EstimateNumber)) RevisionFree_EstimateNumber

            FROM [dbo].[tablename1]
            where EstimateDate BETWEEN DATEADD(Day, -10, getdate()) AND GETDATE() And TotalSellPrice > '5000' AND EstimateStatus = 'P'
            Order By TotalSellPrice DESC
        )AS T20

        LEFT JOIN 
        (
            SELECT *, SUBSTRING(EstimateNumber, 1, CHARINDEX('-', EstimateNumber)) RevisionFree_EstimateNumber 
            FROM [dbo].[tablename1]
        ) t
            ON T20.RevisionFree_EstimateNumber = t.RevisionFree_EstimateNumber
        GROUP BY T20.RevisionFree_EstimateNumber
    )LastEN
        ON tt.EstimateNumber = LastEN.Last_EstimateNumber


您存储的值
24545-1
本质上意味着您的报价“Number”不能是数字<代码>'24545-1'必须存储为
varchar
。在我看来,您应该将修订号单独存储到报价编号中。否则,如果您有10个修订版,您将遇到问题,因为
'24545-10'
的值低于
'24545-2'
您好,谢谢您的回复。这里的问题是,这是我们几年前购买的外部第三方软件。我们无法控制数据设计。我假设
EstimateNumber
是您的“报价编号”?假设是正确的。EstimateNumber是我的报价编号您存储的值
24545-1
本质上意味着您的报价“编号”不能是数字<代码>'24545-1'必须存储为
varchar
。在我看来,您应该将修订号单独存储到报价编号中。否则,如果您有10个修订版,您将遇到问题,因为
'24545-10'
的值低于
'24545-2'
您好,谢谢您的回复。这里的问题是,这是我们几年前购买的外部第三方软件。我们无法控制数据设计。我假设
EstimateNumber
是您的“报价编号”?假设是正确的。EstimateNumber是我的报价编号。这太棒了,确实有效。然而,我看到的一个小问题是,修订版的估算数字没有打印出来。它显示最新版本为7,但与之关联的估计数未显示。
EstimateNumber
位于
SELECT
@ParthKadakia中,但我将报价编号和修订号分开。是,当分开时,不显示报价编号或估计数。是:
SELECT TOP(20)EstimateNumber,RevisionNumber,
我得到以下EstimateNumber RevisionNumber客户名称工作描述TotalSellPrice EstimateStatus EstimateDate佣金表空7辆面包车正在绿皮书xxxxx P 2019-10-22 00:00:00.000这太棒了,确实有效。然而,我看到的一个小问题是,修订版的估算数字没有打印出来。它显示最新版本为7,但与之关联的估计数未显示。
EstimateNumber
位于
SELECT
@ParthKadakia中,但我将报价编号和修订号分开。是,当分开时,不显示报价编号或估计数。是:
SELECT TOP(20)EstimateNumber,RevisionNumber,
我得到以下EstimateNumber RevisionNumber客户名称工作描述TotalSellPrice EstimateStatus EstimateDate佣金表A空7辆面包车正在绿皮书xxxxx P 2019-10-22 00:00:00.000您好Farhad,谢谢回复,我有一些问题,如Msg 102,15级,状态1,第10行“附近的语法不正确”(“.Msg 156,第15级,状态1,第22行关键字“Order”附近的语法不正确。它来自
Order By
。我很快会检查。我已经修改了查询。请检查,并让我知道是否有任何问题。谢谢,明天回到办公室时会检查它。嗨,Farhad,谢谢你的回复,我有一些问题,如Msg 102,15级,State 1,第10行“(”附近的语法不正确。Msg 156,第15级,状态1,第22行关键字“订单”附近的语法不正确。它来自
Order By
。我很快会检查。我已经修改了查询。请检查,并让我知道是否有任何问题。谢谢,明天回到办公室时将检查它。