我有一个Microhydel应用程序的两个表,一个包含生成每月客户Bill的消费者的月度计费记录。
CREATE TABLE billing_history(
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[reading_date] [date] NOT NULL,
[reading_year] [smallint] NULL,
[reading] [numeric](18, 0) NOT NULL,
[consumer_id] [int] NOT NULL,
[paid_amount] [numeric](18, 0) NULL)
我有另一张桌子,为商业和国内用户存储每单位成本不同的板坯。
CREATE TABLE [rate_list](
[flag] [varchar](50) NULL,
[limit] [numeric](18, 0) NOT NULL,
[price] [numeric](18, 0) NOT NULL,
[service_charges] [numeric](18, 0) NOT NULL,
[surcharge] [numeric](18, 0) NOT NULL
)
例如,对于每月消耗50个或更少电量的国内客户,将按照与消耗相同电量的商业客户不同的方式收取费用。同样,在这块板上消耗单位将对它们施加另一种费率。
感谢@bluefeet我已经有了查询来生成使用查询从第一个表中消耗的单位数
select c.consumer_id,
sum(c.reading - isnull(pre.reading, 0)) TotalReading
from
(
select consumer_id,
reading,
month(getdate()) curMonth,
year(getdate()) curYear,
case when month(getdate()) = 1 then 12 else month(getdate()) -1 end preMonth,
case when month(getdate()) = 1 then year(getdate())-1 else year(getdate()) end preYear
from billing_history
where month(reading_date) = month(getdate())
and year(reading_date) = year(getdate())
) c
left join billing_history pre
on c.consumer_id = pre.consumer_id
and month(pre.reading_date) = c.preMonth
and year(pre.reading_date) = c.preYear
group by c.consumer_id;
但是,我需要为每个客户生成每月帐单,以便例如根据rate_list表中的费率。这里的关键是国内/商业,它对于消耗的单位数量有不同的板块。
任何想法
答案 0 :(得分:1)
对我的回答有一些评论。
首先,我不确定您发布的SQL Fiddle中type_of_connection
标记的位置,因此我将其添加到Consumers
。
其次,我认为您需要更改price_list2
表,以包含价格的limit
开始和结束值。否则,很难确定每个消费者的价格。
我使用了以下price_list2
表,其中包含每个限制的开始/结束值:
CREATE TABLE [price_list2](
[flag] [varchar](50) NULL,
[limitStart] [numeric](18, 0) NOT NULL,
[limitEnd] [numeric](18, 0) NOT NULL,
[price] [numeric](18, 0) NOT NULL,
[service_charges] [numeric](18, 0) NOT NULL,
[surcharge] [numeric](18, 0) NOT NULL);
在查询中,使用您发布的表和原始查询,您应该可以使用以下内容:
select c.consumer_id,
r.totalreading * p.price TotalBill
from Consumers c
inner join
(
select c.consumer_id,
sum(c.reading - isnull(pre.reading, 0)) TotalReading
from
(
select consumer_id,
reading,
month(getdate()) curMonth,
year(getdate()) curYear,
case when month(getdate()) = 1 then 12 else month(getdate()) -1 end preMonth,
case when month(getdate()) = 1 then year(getdate())-1 else year(getdate()) end preYear
from billing_history
where month(reading_date) = month(getdate())
and year(reading_date) = year(getdate())
) c
left join billing_history pre
on c.consumer_id = pre.consumer_id
and month(pre.reading_date) = c.preMonth
and year(pre.reading_date) = c.preYear
group by c.consumer_id
) r
on c.consumer_id = r.consumer_id
inner join price_list2 p
on c.type_of_connection = p.flag
and r.totalreading between p.limitStart and p.limitEnd
正如您在加入price_list2
表时所看到的那样,我正在加入限制的开始/结束范围。这允许您确定应该用于账单的价格。