【发布时间】:2014-12-19 23:12:09
【问题描述】:
更新
我正在为不同地点的购物中心租户开发一个在线销售监控系统,使用我只是升级和修改的现有系统。所有销售交易都将被汇总,包括默认的折扣,只有在折扣被批准时才将折扣排除在销售总和中。我的问题将集中在该交易上 - 考虑到每个给定日期和每个租户的折扣金额的排除和包含,获得正确的总销售额。
这是现有数据库结构的预览供您参考。
场景/示例:
我想获得 Location1 与 2 个租户在 2014 年 1 月的销售报告,1 月 1 日和 3 日 的 CMJOLL13(租户1)折扣已获批准, 1 月 1 日和 2 日的 CMMISL13(租户 2)折扣已获批准。
我应该得到那个地点的月度总销售额报告,列出 2 个租户的总销售额,考虑到折扣扣除和包含。
Daily Table
Tenantcode Date Other Cash Charge Gift GrossSales
(Formulated column)
CMJOLL13 01/01/2014 100 100 100 100 300
CMJOLL13 01/02/2014 100 100 100 100 400
CMJOLL13 01/03/2014 100 100 100 100 300
and so on
CMMISL13 01/01/2014 100 100 100 100 300
CMMISL13 01/02/2014 100 100 100 100 300
CMMISL13 01/03/2014 100 100 100 100 400
and so on
Discount Table
Date Tenantcode
01/01/2014 CMJOLL13
01/03/2014 CMJOLL13
01/01/2014 CMMISL13
01/02/2014 CMMISL13
期望/正确的输出
Monthly Table (Jan 2014) - will display the summation amount based on the example only
Tenantcode GrossSales
CMMISL13 1000
CMJOLL13 1000
这是我目前拥有的代码
select a.tenantcode, convert(varchar(10), a.date, 101) as Date,
SUM(a.other) as Other, SUM(a.CASH) as Cash,
SUM(a.CHARGE) AS Charge, SUM(a.GIFT) AS Gift,
case
when a.date IN (select Z.date from discount Z inner join daily a on z.date = a.date and z.tenantcode = a.tenantcode where Z.date between '01/01/2014' and '01/31/2014' and a.location = 1)
THEN (SUM(a.cash) + SUM(a.charge) + SUM(a.gift))
ELSE (SUM(a.cash) + SUM(a.charge) + SUM(a.gift) + SUM(a.other))
END as GrossSales
into #MonthlyTemp
from TENANT b inner join LOCATION c on b.location=c.location inner join DAILY a on a.tenantcode=b.tenantcode
where a.location = 1 AND
a.date BETWEEN '02/01/2014' and '02/28/2014'
GROUP BY a.tenantcode , a.date
SELECT tenantcode, SUM(GrossSales)
from #MonthlyTemp
where LOCATION = 1 AND
date BETWEEN '01/01/2014' and '01/31/2014'
group by tenantcode
基于查询的实际输出
Tenantcode GrossSales
CMMISL13 900
CMJOLL13 900
显然它不会返回正确的期望输出。 我认为这是因为万一部分的日期显示折扣表中的所有日期。我在上面的代码中使用了临时表,现在我正在考虑在 sql 中使用 While 循环来测试每个位置。
任何帮助将不胜感激。希望得到您的专业建议。祝您有美好的一天!
【问题讨论】:
-
合并销售额不应该是300+400+400 = 1100吗?
-
是的!我站得更正了。谢谢你:)我真的被这个问题困住了。
-
你为什么要拿
SUM的东西?同一天的租户代码可以有多个折扣吗? -
因为一个租户代码可能有超过 1 个终端号,并且它是我没有包含的列的一部分,以便更短的展示。每个租户代码应总结其结合所有终端的所有销售额。日常销售实际上没有问题,因为我能够实现所需的输出,我的问题是在不是每天的情况下使用 CONSOLIDATED,但是给定一个日期范围,比如说每周或每月
-
回答,是的,可能有两个或多个终端没有列都具有相同的租户代码
标签: sql sql-server subquery case exists