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 です。
何か案は