SQL Добавляет данные из одного столбца в другой в той же таблице

#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 только один раз в своем запросе, поэтому я удалил его из первого, и он смог выполняться, спасибо!