我有表A,如下所示:
Name Amount
Bob 245.000.000
Jack 98.123.000
Mike 450.000.000
Smith 455.000.000
John 500.000.000
和表B作为参数表
Class Range_min Range Max
<= 100 MIO 0 100000000
> 100 - 250 MIO 100000001 250000000
> 250 - 450 MIO 250000001 450000000
> 450 MIO 450000001
有人可以帮助我得到如下结果:
Class #ofRecord
<= 100 MIO 1
> 100 - 250 MIO 1
> 450 MIO 3
如果我修改了参数表(类或范围),我不需要更改查询。
答案 0 :(得分:0)
您可以使用以下语句执行此操作:
SELECT [Class], COUNT(*)
FROM TableA INNER JOIN TableB
ON TableA.Amount BETWEEN COALESCE(TableB.[Range_min], TableA.Amount) AND
COALESCE(TableB.[Range Max], TableA.Amount)
GROUP BY [Class]
你也可以看到工作SQLFiddle。
几点说明:
1.您的“请求输出”不正确。 “迈克”是250-450。
你真的应该对你的列使用一些命名约定。 (Range_min
,Range Max
)
答案 1 :(得分:0)
这是两个表之间的简单连接:
declare @A table (Name varchar(17) not null,Amount bigint not null)
declare @B table (Class varchar(31) not null,Range_min bigint not null,Range_Max bigint null)
insert into @A(Name,Amount) values
('Bob' ,245000000),
('Jack' ,98123000 ),
('Mike' ,450000000),
('Smith',455000000),
('John' ,500000000)
insert into @B(Class,Range_min,Range_Max) values
('<= 100 MIO' ,0 ,100000000),
('> 100 - 250 MIO',100000001,250000000),
('> 250 - 450 MIO',250000001,450000000),
('> 450 MIO' ,450000001,null )
select b.Class,COUNT(*)
from
@B b
inner join
@A a
on
b.Range_min <= a.Amount and
(
a.Amount <= b.Range_Max or
b.Range_Max is null
)
group by b.Class
产生结果:
Class
------------------------------- -----------
<= 100 MIO 1
> 100 - 250 MIO 1
> 250 - 450 MIO 1
> 450 MIO 2
这与您的预期结果不符,但鉴于样本数据,它似乎是正确的。