This is, I believe, a general solution, though I tested it using IBM Informix Dynamic Server 11.50.FC3. The following query:
SELECT grade,
ROUND(100.0 * grade_sum / (SELECT COUNT(*) FROM grades), 2) AS pct_of_grades
FROM (SELECT grade, COUNT(*) AS grade_sum
FROM grades
GROUP BY grade
)
ORDER BY grade;
gives the following output on the test data shown below the horizontal rule. The ROUND
function may be DBMS-specific, but the rest (probably) is not. (Note that I changed 100 to 100.0 to ensure that the calculation occurs using non-integer – DECIMAL, NUMERIC – arithmetic; see the comments, and thanks to Thunder.)
grade pct_of_grades
CHAR(1) DECIMAL(32,2)
A 32.26
B 16.13
C 12.90
D 12.90
E 9.68
F 16.13
CREATE TABLE grades
(
id VARCHAR(10) NOT NULL,
grade CHAR(1) NOT NULL CHECK (grade MATCHES '[ABCDEF]')
);
INSERT INTO grades VALUES('1001', 'A');
INSERT INTO grades VALUES('1002', 'B');
INSERT INTO grades VALUES('1003', 'F');
INSERT INTO grades VALUES('1004', 'C');
INSERT INTO grades VALUES('1005', 'D');
INSERT INTO grades VALUES('1006', 'A');
INSERT INTO grades VALUES('1007', 'F');
INSERT INTO grades VALUES('1008', 'C');
INSERT INTO grades VALUES('1009', 'A');
INSERT INTO grades VALUES('1010', 'E');
INSERT INTO grades VALUES('1001', 'A');
INSERT INTO grades VALUES('1012', 'F');
INSERT INTO grades VALUES('1013', 'D');
INSERT INTO grades VALUES('1014', 'B');
INSERT INTO grades VALUES('1015', 'E');
INSERT INTO grades VALUES('1016', 'A');
INSERT INTO grades VALUES('1017', 'F');
INSERT INTO grades VALUES('1018', 'B');
INSERT INTO grades VALUES('1019', 'C');
INSERT INTO grades VALUES('1020', 'A');
INSERT INTO grades VALUES('1021', 'A');
INSERT INTO grades VALUES('1022', 'E');
INSERT INTO grades VALUES('1023', 'D');
INSERT INTO grades VALUES('1024', 'B');
INSERT INTO grades VALUES('1025', 'A');
INSERT INTO grades VALUES('1026', 'A');
INSERT INTO grades VALUES('1027', 'D');
INSERT INTO grades VALUES('1028', 'B');
INSERT INTO grades VALUES('1029', 'A');
INSERT INTO grades VALUES('1030', 'C');
INSERT INTO grades VALUES('1031', 'F');
Доброго времени суток!
Есть БД магазина автозапчастей, это мой курсовой проект, необходимо было создать БД, таблицы и их заполнить, и написать к ним 10 запросов, первые 6 прошли успешно, с оставшимися проблемс.
Вообщем, помогите пожалуйста сделать следующие запросы:
7. | Получить долю товара конкретного поставщика в процентах, единицах от всего оборота магазина прибыль магазина за указанный период. |
8. | Получить накладные расходы в процентах от объема продаж. |
9. | Получить перечень и общее количество не проданного товара на складе за определенный период (залежалого) и его объем от общего товара в процентах. |
8 запрос я реализовал следующим образом:
SQL | ||
|
В универе в аудитории поменял тип данных для “Stoimost” и “Cena_prodazhi” на float прямо в SQL Servere в пару кликов, и доля в процентах успешно посчиталась (надеюсь что и экономически всё верно). Но дома SQL Server не разрешает изменять тип данных, говорит удалите таблицу и заново создайте. Может я что-то не так делаю?
Осталось разобраться с 7 и 9 запросами.
Прикрепляю БД. Описание предметной области на всякий случай тоже упаковал в архив.
Запросы.rar
Добрые люди, помогите пожалуйста, сил уже нет сидеть и голову ломать с этими запросами..
По возможности, обязательно отблагодарю на киви!
P.S. Если получится то и этот можно тоже разобрать , но для него я так понимаю нужно новую таблицу (БРАК) создавать…. обновлять модели в эрвине…. перескринивать всё это дело в отчет…..
SQL | ||
|
I have to calculate percentage based on count. Given below is a sample data table.
TeamName Count1 Count0
-------- ----- ------
Team1 1 2
Team2 3 0
Team3 1 1
I want to display the percentage based on the greatest value
in Count1
. The expecting output sample is given below:
Expecting Out Put :
TeamName Count1 Count0 Percentage1 Percentage0
-------- ----- ------ ----------- -----------
Team1 1 2 33.33% 66.6%
Team2 3 0 100% 0%
Team3 1 1 33.33% 33.33%
Help me to find a proper solution. Thank You.
asked Jan 16, 2015 at 10:37
5
use Max()over ()
trick to find the max of all the row.
select TeamName,
Count1,
Count0,
(count1*100.0)/nullif(Max(Count1) over(),0) Percentage1,
(count0*100.0)/nullif(max(Count1) over(),0) Percentage2
from yourtable
or Use a subquery
to find the Max
and do the math
SELECT
TeamName,
Count1,
Count0,
(Count1*100.0) / nullif((SELECT max(Count1) FROM yourTable),0) Percentage1,
(Count0*100.0) / nullif((SELECT max(Count1) FROM yourTable),0) Percentage2
FROM yourTable
answered Jan 16, 2015 at 10:40
Pரதீப்Pரதீப்
91.2k18 gold badges130 silver badges168 bronze badges
9
SELECT
TeamName,
Count1,
Count0,
Count1 / (SELECT MAX(Count1) FROM Tbl),
Count0 / (SELECT MAX(Count1) FROM Tbl)
FROM Tbl
What out for zero values in Count1. I can improve answer, if you describe case what to do when MAX(Count1) is zero.
answered Jan 16, 2015 at 10:40
Taras VelykyyTaras Velykyy
1,7711 gold badge16 silver badges30 bronze badges
Maybe this will help you:
SELECT a.TeamName,
a.Count1,
a.Count0,
a.Count1 / b.maxCount * 100
a.Count0 / b.maxCount * 100
FROM yourTable a
JOIN(SELECT MAX(Count1)
FROM yourTable
) b
ON 1 = 1;
answered Jan 16, 2015 at 10:48
DirkNMDirkNM
2,61414 silver badges21 bronze badges
try this.
create table tbl(teamname nvarchar(100), count1 int, count2 int)
insert into tbl values
('T1',1,2), ('T2',3,0), ('T3',1,1)
select
teamname,
count1,
count2,
count1 * 100 /(count1 + count2) Percenta1,
count2 * 100 /(count1 + count2) Percenta2
From tbl
drop table tbl
answered Jan 16, 2015 at 10:48
Ajay2707Ajay2707
5,6566 gold badges40 silver badges58 bronze badges
looking at your question, it seems if value is 1 then it is 33.33%, for 2 it is 66.6% & for 3 it is 100%. in this case yuo can try below:
SELECT COUNT1, COUNT0,
DECODE(COUNT1,1,'33.33%',2,'66.6%',3,'100%') PERCENTAGE1,
DECODE(COUNT0,1,'33.33%',2,'66.6%',3,'100%') PERCENTAGE0
FROM tablename;
if it is not the case, then please explain why for row3 in your table, both percentage1 and 0 are 33.33 %
answered Jan 16, 2015 at 10:58
ShantanuShantanu
1861 silver badge8 bronze badges
У нас есть две таблицы с двумя столбцами каждая.
Таблица 1: Клиенты
+----+-------+
| Id | Name |
+----+-------+
| 1 | Joe |
| 2 | Henry |
| 3 | Sam |
| 4 | Max |
+----+-------+
Таблица 2: Заказы
+----+------------+
| Id | CustomerId |
+----+------------+
| 1 | 3 |
| 2 | 1 |
+----+------------+
Мы хотим рассчитать процент клиентов, которые не сделали заказов.
Запрос, чтобы показать клиентов, которые не сделали заказов:
SELECT name AS Customers FROM customers
WHERE id NOT IN (SELECT customerid FROM orders);
Это выводит:
+-----------+
| Customers |
+-----------+
| Henry |
| Max |
+-----------+
Я подумал, что мы могли бы просто рассчитать процент, взяв счетчик запроса выше, деленный на счетчик всех имен, что даст нам ответ 50%:
COUNT(SELECT name AS Customers FROM customers
WHERE id NOT IN (SELECT customerid FROM orders)) /
SELECT COUNT(DISTINCT name) FROM customers;
Это не похоже на работу. Чего не хватает?
Заранее спасибо!