Відділ (/) не дає моєї відповіді в postgresql


85

У мене є таблиця softwareі стовпців в ній , як dev_cost, sell_cost. Якщо dev_cost16000 і sell_cost7500.

Як знайти кількість програмного забезпечення для продажу, щоб відновити dev_cost?

Я запитував, як показано нижче:

select dev_cost / sell_cost from software ;

Він відповідає 2 як відповідь. Але нам потрібно отримати 3, так?

Що може бути запитом для цього? Заздалегідь спасибі.


Якщо sell_cost дорівнює 7500, нам потрібно продати 3 програми для відновлення dev_cost, тобто> 16000. Це моє питання
zeewagon

4
спробуватиselect ceil(16000::numeric/7500)
Vivek S.

Це спрацювало. Дякую wingedpanther :)
zeewagon

1
вибрати Ceil (dev_cost :: numeric / sell_cost) із програмного забезпечення; --працював
zeewagon

Відповіді:


143

У ваших стовпцях є цілі типи, і ціле ділення скорочує результат до нуля . Щоб отримати точний результат, вам потрібно буде надати принаймні одне із значень з плаваючою чи десятковою формулою :

select cast(dev_cost as decimal) / sell_cost from software ;

або просто:

select dev_cost::decimal / sell_cost from software ;

Потім ви можете округлити результат до найближчого цілого числа, використовуючи ceil()функцію:

select ceil(dev_cost::decimal / sell_cost) from software ;

(Див. Демонстрацію на SQLFiddle .)


Ми говоримо про гроші. Відтворюється в десятковій точці, а не з плаваючою точкою.
Mike Sherrill 'Cat Recall'

@Mike: Хороша думка, хоча навряд чи це має значення у справі ОП. (Все, про що вони просять, це ціле ділення, яке округлюється; плаваючі знадобляться просто як проміжний тип для цього, принаймні, якщо вихідні значення не є бігінтами.) Тим не менше, виправлено.
Ilmari Karonen

@IlmariKaronen Дякую! Ваша відповідь мені допомогла.
MRah

2
@MRah: Я радий допомогти. :) До речі, замість того, щоб коментувати відповіді, які вам здаються корисними, ви можете проголосувати за них, натиснувши піктограму трикутника, спрямовану вгору, у верхньому лівому куті відповіді. Це винагородить відповідача балами за репутацію і дасть йому зрозуміти, що їх відповідь оцінена, а також допомагає найкращим відповідям піднятися на початок сторінки.
Ілмарі Каронен

9

Ви можете передати цілий тип numericі скористатися ceil()функцією, щоб отримати бажаний результат

Функція PostgreSQL ceil повертає найменше ціле значення, яке більше або дорівнює числу.

SELECT 16000::NUMERIC / 7500 col 
      ,ceil(16000::NUMERIC / 7500) 

Результат:

col                  ceil 
------------------   ---- 
2.1333333333333333     3    

Тож ваш запит повинен бути

select ceil(dev_cost::numeric/sell_cost) 
from software

5

Ви також можете привести свою змінну до потрібного типу, а потім застосувати поділ:

 SELECT (dev_cost::numeric/sell_cost::numeric);

Ви можете округлити своє значення і вказати кількість цифр після точки:

SELECT TRUNC((dev_cost::numeric/sell_cost::numeric),2);

Чи існує реальна потреба використовувати :: decimal для кожного операнда?
ов

1

Цей запит заокружить результат до наступного цілого числа

select round(dev_cost ::decimal / sell_cost + 0.5)

Це дасть неправильний результат, якщо dev_costце ціле число, кратне sell_cost: див. Приклад .
Ilmari Karonen

Цей запит нормальний. Але якщо в таблиці більше значень, скажімо, наприклад, dev_cost дорівнює 6000, а sell_cost дорівнює 400, відповідь 15 буде правильною. Але ваш запит відповідає 16. Що нам робити? Я новачок у SQL, виправте мене, якщо помиляюсь.
zeewagon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.