根据SQL SERVER中另一个表的条件获取结果

时间:2013-02-05 17:12:33

标签: sql-server database

我有一个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表中的费率。这里的关键是国内/商业,它对于消耗的单位数量有不同的板块。

任何想法

1 个答案:

答案 0 :(得分:1)

对我的回答有一些评论。

首先,我不确定您发布的SQL Fiddletype_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

请参阅SQL Fiddle with Demo

正如您在加入price_list2表时所看到的那样,我正在加入限制的开始/结束范围。这允许您确定应该用于账单的价格。