4

範囲という名前の範囲テーブルからのサンプル データを以下に示します。

+-----------------+-------------------+----------+----------+
| SectionCategory |     RangeName     | LowerEnd | UpperEnd |
+-----------------+-------------------+----------+----------+
| Sanction        | 0-7 days          |        0 |        7 |
| Sanction        | 8-15 days         |        8 |       15 |
| Sanction        | More than 15 days |       16 |    99999 |
| Disbursal       | 0-7 days          |        0 |        7 |
| Disbursal       | 8-15 days         |        8 |       15 |
| Disbursal       | More than 15 days |       16 |    99999 |
+-----------------+-------------------+----------+----------+

遅延テーブルのサンプル データを以下に示します。

+-----------+---------------+-----------------+
| Loan No.  | SanctionDelay | Disbursal Delay |
+-----------+---------------+-----------------+
|       247 |             8 |              35 |
|       661 |            18 |              37 |
|      1235 |            12 |               6 |
|      1235 |             8 |              15 |
|      1241 |            28 |               9 |
|      1241 |            11 |               9 |
|      1283 |            22 |              20 |
|      1283 |            28 |              41 |
|      1523 |             1 |              27 |
|      1523 |             6 |              28 |
+-----------+---------------+-----------------+

目的の出力を以下に示します。

+-----------+-------------------+-------+
|  Section  |       Range       | Count |
+-----------+-------------------+-------+
| Sanction  | 0-7 days          |     2 |
| Sanction  | 8-15 days         |     4 |
| Sanction  | More than 15 days |     4 |
| Disbursal | 0-7 days          |     1 |
| Disbursal | 8-15 days         |     3 |
| Disbursal | More than 15 days |     6 |
+-----------+-------------------+-------+

現在、2 つの別個のクエリが作成されており、出力の照合には UNION が使用されています。

保守性の観点から、単一のクエリでこれを行うことは可能でしょうか? (Ranges テーブルの Sanction の場合、Delays テーブルの SanctionDelay 列を使用し、Disbursal の場合、DisbursalDelay 列を使用する必要があります。) この必要性は、ローンのライフサイクルの段階数が増加し、ますます多くの UNION が予想されるためです。出力を照合するために必要になります。

4

2 に答える 2

3

で行うことができますが、CROSS JOINそれがどれほど効率的かはわかりません。

サンプルデータ:

declare @Ranges table (SectionCategory varchar(10) not null,RangeName varchar(20) not null,LowerEnd int not null,UpperEnd int not null)
insert into @Ranges (SectionCategory,RangeName,LowerEnd,UpperEnd) values
('Sanction','0-7 days',0,7),
('Sanction','8-15 days',8,15),
('Sanction','More than 15 days',16,99999),
('Disbursal','0-7 days',0,7),
('Disbursal','8-15 days',8,15),
('Disbursal','More than 15 days',16,99999)

declare @Delays table (LoanNo int not null,SanctionDelay int not null,DisbursalDelay int not null)
insert into @Delays (LoanNo,SanctionDelay,DisbursalDelay) values
( 247, 8,35),
( 661,18,37),
(1235,12, 6),
(1235, 8,15),
(1241,28, 9),
(1241,11, 9),
(1283,22,20),
(1283,28,41),
(1523, 1,27),
(1523, 6,28)

クエリ (サンプル データと同じバッチで実行する必要があります):

select
    r.SectionCategory,
    r.RangeName,
    SUM(CASE
        WHEN r.SectionCategory='Sanction' and d.SanctionDelay BETWEEN r.LowerEnd and r.UpperEnd then 1
        WHEN r.SectionCategory='Disbursal' and d.DisbursalDelay BETWEEN r.LowerEnd and r.UpperEnd then 1
        else 0 end) as Cnt
from @Ranges r
    cross join
    @Delays d
group by
    r.SectionCategory,
    r.RangeName
order by SectionCategory,RangeName

結果:

SectionCategory RangeName            Cnt
--------------- -------------------- -----------
Disbursal       0-7 days             1
Disbursal       8-15 days            3
Disbursal       More than 15 days    6
Sanction        0-7 days             2
Sanction        8-15 days            4
Sanction        More than 15 days    4

保守性の観点からは、遅延テーブルに 1 つの遅延列と、遅延の種類を指定する追加の列を用意する方がよい場合があります。現時点では、ある種の属性分割のように感じます。Ranges テーブルでは、タイプは列の値 ( 、 など) として表されますSanctionDisbursal、delays テーブルでは、この同じ「タイプ」がテーブル メタで表されます。データ、個別の列名の観点から。

「ローンのライフサイクルのステージ数が増えると予想される」とおっしゃっていますが、このクロスオーバー (一部のテーブルではデータとして属性を表し、他のテーブルではメタデータとして属性を表す) により、適切なクエリを作成する手間が増えると思います。 .

于 2013-06-07T07:16:28.397 に答える