SQL:按1到10的比例排列数字

SQL:按1到10的比例排列数字,sql,sql-server,database,where-clause,min,Sql,Sql Server,Database,Where Clause,Min,我在SQLServer2008数据库中有一个表,其中有一个数字列,我希望按1到10的比例排列 下面是一个示例,其中列(Scale)是我希望用SQL实现的 Name Count (Scale) ---------------------- A 19 2 B 1 1 C 25 3 D 100 10 E 29 3 F 60 7 在上面的示例

我在SQLServer2008数据库中有一个表,其中有一个数字列,我希望按1到10的比例排列

下面是一个示例,其中列(
Scale
)是我希望用SQL实现的

Name    Count   (Scale)
----------------------
A       19      2       
B       1       1
C       25      3
D       100     10
E       29      3
F       60      7   
在上面的示例中,最小和最大计数分别为1和100(这可能每天都不同)

我想得到每条记录所属的号码

1 = 0-9
2 = 10-19
3 = 20-29 and so on...

它必须是动态的,因为这些数据每天都在变化,所以我不能使用带有如下静态数字的
WHERE
子句:
当计数介于0和10之间时…

您可以将
缩放
列a
持久化计算
列作为:

WITH MinMax(Min, Max) AS (SELECT MIN(Count), MAX(Count) FROM Table1)
SELECT Name, Count, 1 + 9 * (Count - Min) / (Max - Min) AS Scale
FROM Table1, MinMax
alter table test drop column Scale

ALTER TABLE test ADD
Scale AS (case when Count between 0 and 9 then 1 
               when Count between 10 and 19 then 2
               when Count between 20 and 29 then 3
               when Count between 30 and 39 then 4
               when Count between 40 and 49 then 5 
               when Count between 50 and 59 then 6
               when Count between 60 and 69 then 7
               when Count between 70 and 79 then 8 
               when Count between 80 and 89 then 9
               when Count between 90 and 100 then 10
          end
          )PERSISTED
GO

试试这个,但请注意,从技术上讲,值100不在90-99范围内,因此可能应归类为11,因此为什么值60的刻度是6而不是7:

MS SQL Server 2008架构设置

create table #scale
(
    Name Varchar(10),
    [Count] INT
)

INSERT INTO #scale
VALUES
    ('A', 19),
    ('B', 1),
    ('C', 25),
    ('D', 100),
    ('E', 29),
    ('F', 60)


SELECT name, [COUNT],  
    CEILING([COUNT] * 10.0 / (SELECT MAX([Count])  - MIN([Count]) + 1 FROM #Scale)) AS [Scale]
FROM #scale
| NAME | COUNT | SCALE |
|------|-------|-------|
|    A |    19 |     2 |
|    B |     1 |     1 |
|    C |    25 |     3 |
|    D |   100 |    10 |
|    E |    29 |     3 |
|    F |    60 |     6 |
查询1

create table #scale
(
    Name Varchar(10),
    [Count] INT
)

INSERT INTO #scale
VALUES
    ('A', 19),
    ('B', 1),
    ('C', 25),
    ('D', 100),
    ('E', 29),
    ('F', 60)


SELECT name, [COUNT],  
    CEILING([COUNT] * 10.0 / (SELECT MAX([Count])  - MIN([Count]) + 1 FROM #Scale)) AS [Scale]
FROM #scale
| NAME | COUNT | SCALE |
|------|-------|-------|
|    A |    19 |     2 |
|    B |     1 |     1 |
|    C |    25 |     3 |
|    D |   100 |    10 |
|    E |    29 |     3 |
|    F |    60 |     6 |

create table #scale
(
    Name Varchar(10),
    [Count] INT
)

INSERT INTO #scale
VALUES
    ('A', 19),
    ('B', 1),
    ('C', 25),
    ('D', 100),
    ('E', 29),
    ('F', 60)


SELECT name, [COUNT],  
    CEILING([COUNT] * 10.0 / (SELECT MAX([Count])  - MIN([Count]) + 1 FROM #Scale)) AS [Scale]
FROM #scale
| NAME | COUNT | SCALE |
|------|-------|-------|
|    A |    19 |     2 |
|    B |     1 |     1 |
|    C |    25 |     3 |
|    D |   100 |    10 |
|    E |    29 |     3 |
|    F |    60 |     6 |
这将得到答案,其中60变为7,因此100等于11:

SELECT name, [COUNT],  
    CEILING([COUNT] * 10.0 / (SELECT MAX([Count])  - MIN([Count]) FROM #Scale)) AS [Scale]
FROM #scale

如果你能提供这个问题的直觉,那就更好了。谢谢你,史蒂夫!这对我帮助很大。在我的例子中,100应该是99。我永远不会像数据库本身那么好;)