我们必须根据最近三个月的参数来比较给定日期的销售额。
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
一些事情。
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
或类似的东西会让您明白这一点。