Чтение значения 0.5 в ROW_NUMBER () и PARTITION BY | SQL Server 2012 - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть этот вопрос до Цикл между двумя параметрами случая (диапазон дат и количество строк) | SQL Server 2012 , теперь я думаю о сценарии, что если значение имеет 0,5? или .5? Будет ли это работать, используя ROW_NUMBER()?

Я пытаюсь сделать эту работу, используя только CASE метод.

Это мой старый скрипт:

DECLARE @dbApple TABLE
                 (
                     FromDate varchar(30) NOT NULL,
                     ToDate varchar(30) NOT NULL,
                     Name varchar(30) NOT NULL,
                     Count float(30) NOT NULL
                 )

INSERT INTO @dbApple (FromDate, ToDate, Name, Count) 
VALUES ('2019-10-05', '2019-10-09', 'APPLE', '2.5');

(SELECT
    CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, FromDate))) AS Date,
    DB.Name,
    CASE 
       WHEN CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, FromDate))) BETWEEN CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, FromDate))) AND CONVERT(date, CONVERT(date, DATEADD(D, VAL.NUMBER, ToDate)))
          THEN 
             CASE 
                WHEN ROW_NUMBER() OVER (PARTITION BY Count, FromDate, ToDate ORDER BY Count) <= Count
                   THEN (COUNT / COUNT) 
             END 
    END AS Count
FROM 
    @dbApple DB
JOIN 
    MASTER..SPT_VALUES VAL ON VAL.TYPE = 'P'
                           AND VAL.NUMBER BETWEEN 0 AND DATEDIFF(D, FromDate, ToDate))

Это вывод:

enter image description here

Это мой ожидаемый вывод:

enter image description here

Есть ли способ, чтобы это сработало? Спасибо.

1 Ответ

1 голос
/ 14 февраля 2020

Вы можете значительно упростить свой запрос, отметив, что VAL.NUMBER уже является вашим номером строки (просто начинается с 0 вместо 1). Затем вы можете сравнить ваше значение Count с VAL.NUMBER и, если Count - VAL.NUMBER больше 1, выведите 1; если оно больше 0, выведите разницу, в противном случае выведите NULL. Для этого демонстрационного запроса я смоделировал вашу таблицу чисел с помощью конструктора табличных значений:

declare @dbApple TABLE(
    FromDate varchar(30) NOT NULL,
    ToDate varchar(30) NOT NULL,
    Name varchar(30) NOT NULL,
    Count float(30) NOT NULL
)

INSERT INTO @dbApple
(FromDate,ToDate,Name,Count) VALUES ('2019-10-05','2019-10-09','APPLE',2.5);

SELECT
    CONVERT(date,CONVERT(date,DATEADD(D,VAL.NUMBER,FromDate))) AS Date,
    Name,
    CASE WHEN Count - VAL.NUMBER > 1 THEN 1
         WHEN Count - VAL.NUMBER > 0 THEN Count - VAL.NUMBER
    END AS Count
FROM 
    @dbApple D
JOIN (VALUES (0), (1), (2), (3), (4), (5)) VAL(NUMBER)
  ON VAL.NUMBER BETWEEN 0 AND DATEDIFF(D, FromDate, ToDate)

Вывод:

Date        Name    Count
2019-10-05  APPLE   1
2019-10-06  APPLE   1
2019-10-07  APPLE   0.5
2019-10-08  APPLE   (null)
2019-10-09  APPLE   (null)

Демо на dbfiddle

...