Найти последнюю запись среди того же номера с тире? - PullRequest
0 голосов
/ 30 октября 2019

У нас есть таблица, в которой хранится список всех отправленных нами цитат.

Каждый раз, когда клиент пересматривает котировки, система автоматически добавляет -1 или -2 на основе последнего использованного номера.

В качестве примера

Оригинальный номер цитаты: 24545

Клиент запросил ревизию, номер котировки теперь 24545-1, после отправки котировки у нас снова есть ревизия, а котировка 24545-2 и т. Д.

Я хочучтобы выполнить запрос SQL, который покажет им их 20 лучших цитат и количество ревизий, он должен показать последние ревизии.

Не могли бы вы мне помочь?

Я уже написал запрос, которыйпринес бы мне 20 лучших цитат за последние 10 дней.

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

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Это делает некоторые предположения, но я думаю, это может сработать. В противном случае данные выборки и ожидаемый результат будут неоценимыми:

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;
0 голосов
/ 30 октября 2019

С некоторыми незначительными изменениями это может сработать, так как выборка данных отсутствует:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...