使用带有其他表的条件而没有关系密钥的用例

时间:2015-07-29 07:26:56

标签: sql sql-server-2008 tsql

我有表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

如果我修改了参数表(类或范围),我不需要更改查询。

2 个答案:

答案 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_minRange 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

这与您的预期结果不符,但鉴于样本数据,它似乎是正确的。