1

Microhydel アプリケーション用に 2 つのテーブルがあります。1 つは、毎月の顧客請求書が生成される消費者の毎月の請求レコードで構成されています。

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 テーブルの料金に従って、顧客ごとに毎月の請求書を生成する必要があります。ここでのキーは、消費されるユニット数の異なるスラブを持つ DOMESTIC/COMMERCIAL です。

何か案は

4

1 に答える 1

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 を参照してください

テーブルに参加するとわかるようにprice_list2、制限の開始/終了範囲に参加しています。これにより、請求書に使用する価格を決定できます。

于 2013-02-05T19:25:57.777 に答える