2017-04-02 26 views
0

PSQL(9.6.1,9.5.5服務器)如何不在選擇中計算兩次值?

員工

 Column  |   Type    |       Modifiers       | Storage | Stats target | Description 
----------------+-----------------------------+-----------------------------------------------------------------+----------+--------------+---- --------- 
employee_id | integer      | not null default nextval('employees_employee_id_seq'::regclass) | plain |    | 
first_name  | character varying(20)  |                 | extended |    | 
last_name  | character varying(25)  | not null              | extended |    | 
email   | character varying(25)  | not null              | extended |    | 
phone_number | character varying(20)  |                 | extended |    | 
hire_date  | timestamp without time zone | not null              | plain |    | 
job_id   | character varying(10)  | not null              | extended |    | 
salary   | numeric(8,2)    |                 | main  |    | 
commission_pct | numeric(2,2)    |                 | main  |    | 
manager_id  | integer      |                 | plain |    | 
department_id | integer 

我需要提取員工編號,姓氏,薪金,工資增加了15.5%(表示爲一個整數),以及新舊工資的差額。

我做這樣的:

select employee_id, 
    last_name, 
    salary, 
    round(salary * 1.155, 0) as "New Salary", 
    round(salary * 1.155, 0) - salary as "Increase" 
from employees; 

什麼困擾我的是,我已經計算出新的工資的兩倍。

我試圖在同一選擇中使用別名。這樣做的實驗:

select 2 as val_a, val_a - 4; --not working 

那麼,我的解決方案輸出可以接受的結果。但是沒有更好的解決方案嗎?

+0

如果你擔心表現,那麼不要這樣。 –

回答

1

如果您擔心性能,那麼這個計算就沒什麼用。一些優化器甚至可能在內部重新使用計算。

如果你必須自己做,你可以使用子查詢這樣的:

select t.*, 
    New_Salary - salary as Increase 
from (
    select employee_id, 
     last_name, 
     salary, 
     round(salary * 1.155, 0) as New_Salary, 
    from employees 
    ) t; 
+0

讓我擔心的主要是代碼的可讀性和風格。如果我的解決方案醜陋或您的建議更好的風格? – Michael

+0

你的查詢對我來說很好。雖然我建議使用使用字母,數字和下劃線的標準別名,所以您不必使用雙引號。無處不在的雙引號肯定會傷害可讀性。 – GurV

+0

非常感謝。 – Michael

0

您可以使用子查詢寫吧,如果你是「挑剔」關於不計算相同的值的兩倍:

SELECT 
    *, "New Salary" - salary as "Increase" 
FROM 
(
    SELECT 
     employee_id, 
     last_name, 
     salary, 
     round(salary * 1.155, 0) as "New Salary" 
    FROM 
     employees 
) AS s0 ; 

實際上,當你運行了幾次不同的是不容忽視的:

dbfiddle here