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