如何确定两列的值之间的差异?

时间:2019-07-15 12:23:11

标签: sql database postgresql

假设我在PostgreSQL(版本11)数据库中有这样的表:

| ID | PERSONAL_PERCENT | GLOBAL_PERCENT |
|----|------------------|----------------|
| 1  | 50,6544401544    | 52,5519848771  |
| 1  | 25,0000          | 52,5519848771  |
| 1  | 61,9117647059    | 52,5519848771  |

我正在尝试编写SQL查询,该查询将返回带有新列的结果集。在我的情况下,该列称为COLOR。该列的值取决于列的值为PERSONAL_PERCENTGLOBAL_PERCENT

1)如果PERSONAL_PERCENTGLOBAL_PERCENT大5%,则必须为绿色。例如,61,9117647059列的PERSONAL_PERCENT值比52,5519848771列的GLOBAL_PERCENT值高5%。因此,COLOR列具有GREEN值。

2)如果PERSONAL_PERCENTGLOBAL_PERCENT小5%,则必须为红色。例如,25,0000列的PERSONAL_PERCENT值比52,5519848771列的GLOBAL_PERCENT值低5%。因此,COLOR列具有RED值。

3)如果PERSONAL_PERCENT小于GLOBAL_PERCENT并且相差1%至5%,则必须为黄色。例如,50,6544401544列的PERSONAL_PERCENT值比52,5519848771列的GLOBAL_PERCENT值少不超过5%。因此,COLOR列具有YELLOW值。

我想要这样的最终结果并添加新列:

| ID | PERSONAL_PERCENT | GLOBAL_PERCENT | COLOR  |
|----|------------------|----------------|--------|
| 1  | 50,6544401544    | 52,5519848771  | YELLOW |
| 1  | 25,0000          | 52,5519848771  | RED    |
| 1  | 61,9117647059    | 52,5519848771  | GREEN  |

1 个答案:

答案 0 :(得分:1)

这是一个case表达式:

select t.*,
       (case when personal_percent < global_percent * 0.95 then 'RED'
             when personal_percent > global_percent * 0.95 then 'GREEN'
             else 'YELLOW'
        end) as color
from t;