#sql #sql-server
#sql #sql-сервер
Вопрос:
Код, который я написал до сих пор, сгенерировал выходные данные, перечисленные под заголовком «original». Я пытаюсь добавить дополнительные значения к REVENUE
столбцу, но вместо суммирования из OLDREVENUE
я хочу, чтобы они суммировались из другого столбца с именем NEWREVENUE
, который находится в той же таблице, но связан с будущими датами.
SELECT MONTH_DATE AS MONTH_YEAR,
SUM(OLDREVENUE) AS REVENUE,
[PRODUCT],
COALESCE(TOP_CUST, '(blank)') AS TOP_CUST
FROM [SALES].[TABLE1]
WHERE LEFT(CCYYMM, 4) > YEAR(GETDATE())-5
AND MONTH_DATE IS NOT NULL
AND MONTH_DATE < DateAdd(month, -2, Convert(date, GETDATE()))
AND [PRODUCT] = 'TOWELS'
AND TOP_CUST = 'CUSTOMER1'
GROUP BY [PRODUCT], COALESCE(TOP_CUST, '(blank)'), MONTH_DATE
ORDER BY TOP_CUST, MONTH_DATE
Есть ли способ сделать это так, чтобы NEWREVENUE
значения соответствовали датам от 2020-07-01
до 2021-12-01
?
Пример данных взят из приведенного выше кода, и я хочу, чтобы мой код выдавал желаемые выходные данные после извлечения значений из NEWREVENUE
столбца и добавления их в REVENUE
столбец.
Оригинал:
MONTH_YEAR REVENUE PRODUCT TOP_CUST
2018-01-01 4913 TOWELS CUSTOMER1
2018-02-01 2531 TOWELS CUSTOMER1
2018-03-01 3235 TOWELS CUSTOMER1
2018-04-01 3840 TOWELS CUSTOMER1
2018-05-01 3343 TOWELS CUSTOMER1
2018-06-01 6740 TOWELS CUSTOMER1
2018-07-01 11389 TOWELS CUSTOMER1
2018-08-01 1060 TOWELS CUSTOMER1
2018-09-01 3156 TOWELS CUSTOMER1
2018-10-01 1826 TOWELS CUSTOMER1
2018-11-01 11917 TOWELS CUSTOMER1
2018-12-01 3591 TOWELS CUSTOMER1
2019-01-01 9906 TOWELS CUSTOMER1
2019-02-01 10802 TOWELS CUSTOMER1
2019-03-01 -798 TOWELS CUSTOMER1
2019-04-01 11955 TOWELS CUSTOMER1
2019-05-01 12027 TOWELS CUSTOMER1
2019-06-01 8790 TOWELS CUSTOMER1
2019-07-01 6901 TOWELS CUSTOMER1
2019-08-01 11579 TOWELS CUSTOMER1
2019-09-01 681 TOWELS CUSTOMER1
2019-10-01 62 TOWELS CUSTOMER1
2019-11-01 7534 TOWELS CUSTOMER1
2019-12-01 10234 TOWELS CUSTOMER1
2020-01-01 7064 TOWELS CUSTOMER1
2020-02-01 1201 TOWELS CUSTOMER1
2020-03-01 8989 TOWELS CUSTOMER1
2020-04-01 9722 TOWELS CUSTOMER1
2020-05-01 4605 TOWELS CUSTOMER1
2020-06-01 7248 TOWELS CUSTOMER1
Желаемый результат:
MONTH_YEAR REVENUE PRODUCT TOP_CUST
2018-01-01 4913 TOWELS CUSTOMER1
2018-02-01 2531 TOWELS CUSTOMER1
2018-03-01 3235 TOWELS CUSTOMER1
2018-04-01 3840 TOWELS CUSTOMER1
2018-05-01 3343 TOWELS CUSTOMER1
2018-06-01 6740 TOWELS CUSTOMER1
2018-07-01 11389 TOWELS CUSTOMER1
2018-08-01 1060 TOWELS CUSTOMER1
2018-09-01 3156 TOWELS CUSTOMER1
2018-10-01 1826 TOWELS CUSTOMER1
2018-11-01 11917 TOWELS CUSTOMER1
2018-12-01 3591 TOWELS CUSTOMER1
2019-01-01 9906 TOWELS CUSTOMER1
2019-02-01 10802 TOWELS CUSTOMER1
2019-03-01 -798 TOWELS CUSTOMER1
2019-04-01 11955 TOWELS CUSTOMER1
2019-05-01 12027 TOWELS CUSTOMER1
2019-06-01 8790 TOWELS CUSTOMER1
2019-07-01 6901 TOWELS CUSTOMER1
2019-08-01 11579 TOWELS CUSTOMER1
2019-09-01 681 TOWELS CUSTOMER1
2019-10-01 62 TOWELS CUSTOMER1
2019-11-01 7534 TOWELS CUSTOMER1
2019-12-01 10234 TOWELS CUSTOMER1
2020-01-01 7064 TOWELS CUSTOMER1
2020-02-01 1201 TOWELS CUSTOMER1
2020-03-01 8989 TOWELS CUSTOMER1
2020-04-01 9722 TOWELS CUSTOMER1
2020-05-01 4605 TOWELS CUSTOMER1
2020-06-01 7248 TOWELS CUSTOMER1
2020-07-01 2754 TOWELS CUSTOMER1
2020-08-01 3110 TOWELS CUSTOMER1
2020-09-01 2380 TOWELS CUSTOMER1
2020-10-01 2503 TOWELS CUSTOMER1
2020-11-01 2918 TOWELS CUSTOMER1
2020-12-01 1882 TOWELS CUSTOMER1
2021-01-01 2100 TOWELS CUSTOMER1
2021-02-01 2100 TOWELS CUSTOMER1
2021-03-01 2100 TOWELS CUSTOMER1
2021-04-01 2100 TOWELS CUSTOMER1
2021-05-01 2100 TOWELS CUSTOMER1
2021-06-01 2100 TOWELS CUSTOMER1
2021-07-01 2100 TOWELS CUSTOMER1
2021-08-01 2100 TOWELS CUSTOMER1
2021-09-01 2100 TOWELS CUSTOMER1
2021-10-01 2100 TOWELS CUSTOMER1
2021-11-01 2100 TOWELS CUSTOMER1
2021-12-01 2100 TOWELS CUSTOMER1
Комментарии:
1. Вам нужно объяснить, как вычисляются новые значения.
2. Новые значения уже сохранены в таблице, они не являются вычисляемыми значениями, они просто находятся в другом столбце, который называется
NEWREVENUE
Ответ №1:
Если есть другой столбец с именем NEWREVENUE, который находится в той же таблице, но связан с будущими датами, то добавить эти данные в существующий запрос можно с помощью UNION ALL.
/* Niha's query */
SELECT MONTH_DATE AS MONTH_YEAR,
SUM(OLDREVENUE) AS REVENUE,
[PRODUCT],
COALESCE(TOP_CUST, '(blank)') AS TOP_CUST
FROM [SALES].[TABLE1]
WHERE LEFT(CCYYMM, 4) > YEAR(GETDATE())-5
AND MONTH_DATE IS NOT NULL
AND MONTH_DATE < DateAdd(month, -2, Convert(date, GETDATE()))
AND [PRODUCT] = 'TOWELS'
AND TOP_CUST = 'CUSTOMER1'
GROUP BY [PRODUCT], COALESCE(TOP_CUST, '(blank)'), MONTH_DATE
ORDER BY TOP_CUST, MONTH_DATE
/* Append NEWREVENUE to exising */
UNION ALL
SELECT MONTH_DATE AS MONTH_YEAR,
SUM(NEWREVENUE) AS REVENUE,
[PRODUCT],
COALESCE(TOP_CUST, '(blank)') AS TOP_CUST
FROM [SALES].[TABLE1]
WHERE LEFT(CCYYMM, 4) > YEAR(GETDATE())-5
AND MONTH_DATE BETWEEN '2020-07-01' AND '2021-12-01'
AND [PRODUCT] = 'TOWELS'
AND TOP_CUST = 'CUSTOMER1'
GROUP BY [PRODUCT], COALESCE(TOP_CUST, '(blank)'), MONTH_DATE
ORDER BY TOP_CUST, MONTH_DATE;
В качестве альтернативы может быть дата сокращения и условная сумма ДОХОДА.
declare
@cutover_dt date='2020-07-01',
@end_dt date='2021-12-01',
/* Cutover query */
SELECT MONTH_DATE AS MONTH_YEAR,
iif(MONTH_DATE<@cutover_dt, SUM(OLDREVENUE), SUM(NEWREVENUE)) AS REVENUE,
[PRODUCT],
COALESCE(TOP_CUST, '(blank)') AS TOP_CUST
FROM [SALES].[TABLE1]
WHERE LEFT(CCYYMM, 4) > YEAR(GETDATE())-5
AND MONTH_DATE IS NOT NULL
AND MONTH_DATE < @end_dt
AND [PRODUCT] = 'TOWELS'
AND TOP_CUST = 'CUSTOMER1'
GROUP BY [PRODUCT], COALESCE(TOP_CUST, '(blank)'), MONTH_DATE
ORDER BY TOP_CUST, MONTH_DATE;
Комментарии:
1. Это сработало, идеально! Единственное, что вы можете использовать предложение ORDER BY только один раз в своем запросе, поэтому я удалил его из первого, и он смог выполняться, спасибо!