Как получить дату предыдущих трех месяцев на основе значения параметра от даты и до даты - PullRequest
1 голос
/ 23 октября 2019

Мы должны сравнить продажи по данным на основе параметра от и до даты в последние три месяца.

Create table Net_sales 
(terminalid varchar(14),
Region varchar(20),
City varchar(50),
ICC_TRNS_COUNT int,
ICC_AMount money,
Trns_Date datetime)
--SELECT * FROM Net_sales

insert into Net_sales values ('INMAA031000000','SOUTH','CHENNAI',1,5000,'08/01/2019')
insert into Net_sales values ('INMAA031000000','SOUTH','CHENNAI',1,4000,'08/02/2019')
insert into Net_sales values ('INMAA031000000','SOUTH','CHENNAI',1,200,'08/04/2019')


insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,52000,'08/01/2019')
insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,40700,'08/02/2019')
insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,2200,'08/04/2019')


insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,52000,'09/01/2019')
insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,47000,'09/02/2019')
insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,2200,'09/10/2019')

insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,52000,'10/01/2019')
insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,70000,'10/02/2019')
insert into Net_sales values ('INAMD03900030G','WEST','Gujarat',1,3200,'10/10/2019')
-------------------
DECLARE @FROMDATE DATETIME
DECLARE @TODAY DATETIME 
SET @FROMDATE='08/01/2019'
SET @TODAY='10/10/2019'

SELECT 
TERMINALID ,
CITY,
REGION,
SUM(ICC_AMOUNT) ICASHDMRAMOUNT
FROM NET_SALES WHERE CONVERT(VARCHAR,TRNS_DATE,101) BETWEEN CONVERT(VARCHAR,@FROMDATE,101) AND CONVERT(VARCHAR,@TODAY,101)
GROUP BY TERMINALID ,
CITY,
REGION 
ORDER  BY TERMINALID

нам нужно ожидать и результат Ожидаемый результат

TERMINALID  CITY    REGION  ICASHDMRAMOUNT_AUG  ICASHDMRAMOUNT_SEP  ICASHDMRAMOUNT_OCT
INAMD030001024  Gujarat WEST    94200   94200   94200
INAMD03900030G  Gujarat WEST    94900   101200  125200
INMAA031000000  CHENNAI SOUTH   5000    0   0

1 Ответ

0 голосов
/ 23 октября 2019

Несколько вещей.

TerminalID INAMD030001024 не существует в данных образца, поэтому его нет в наборе результатов выборки.

Ваши даты хранятся в виде дат, поэтому оставьте их без изменений. Когда вы конвертируете их в строки, функции даты больше не работают с ними должным образом. Кроме того, лучше всего использовать стандартный формат даты ANSI / ISO , то есть 'YYYY-MM-DD'. Использование 'MM/DD/YYYY' может быть неверно истолковано как 'DD/MM/YYY' в зависимости от региональных настроек на ваших серверах. Стандартная форма всегда будет правильно интерпретироваться сервером.

С учетом вышесказанного ваш запрос просто требует некоторой условной агрегации:

SELECT 
  TERMINALID,
  CITY,
  REGION,
  SUM(CASE WHEN MONTH(TRNS_DATE) = 8 THEN ICC_AMOUNT ELSE 0 END) AS ICASHDMRAMOUNT_AUG,
  SUM(CASE WHEN MONTH(TRNS_DATE) = 9 THEN ICC_AMOUNT ELSE 0 END) AS ICASHDMRAMOUNT_SEP,
  SUM(CASE WHEN MONTH(TRNS_DATE) = 10 THEN ICC_AMOUNT ELSE 0 END) AS ICASHDMRAMOUNT_OCT
FROM 
 NET_SALES WHERE TRNS_DATE BETWEEN @FROMDATE AND @TODAY
GROUP BY 
  TERMINALID ,
  CITY,
  REGION 
ORDER BY 
  TERMINALID;

Результаты:

TERMINALID  CITY    REGION  ICASHDMRAMOUNT_AUG  ICASHDMRAMOUNT_SEP  ICASHDMRAMOUNT_OCT
INAMD03900030G  Gujarat WEST    94900   101200  125200
INMAA031000000  CHENNAI SOUTH   9200    0   0

SQL Fiddle: http://sqlfiddle.com/#!18/42bfbc/3/0

Если вы отредактируете данные Fiddle, добавив отсутствующий TerminalID, вы должны получить точные желаемые результаты.

EDIT: Если вам нужноэто будет скользящий три месяца, создайте переменную, может быть @FinalMonth int, установите для нее значение MONTH(@TODAY), затем в выражениях CASE используйте @FinalMonth-2, @FinalMonth-1, @FinalMonth вместо жестко закодированных значений выше. В именах ваших столбцов не будет названий месяцев без какого-либо динамического SQL, но _CurrMnth, _PrevMnth, _2ndPrevMnth или что-то подобное поможет вам понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...