Sql как найти долю

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--Процентное выражение затрат от объема продаж
SELECT SUM(a.Stoimost)/SUM(b.Cena_prodazhi)*100
FROM TOVARY a, PRODAZHI b
WHERE a.kod_tovara=b.kod_tovara
 
-- Подсчет суммы затрат на покупку товаров и подсчет выручки
SELECT SUM(a.Stoimost),SUM(b.Cena_prodazhi)
FROM TOVARY a, PRODAZHI b
WHERE a.kod_tovara=b.kod_tovara;
 
-- Подсчёт маржи
SELECT a.Stoimost,b.Cena_prodazhi, b.Cena_prodazhi-a.Stoimost
FROM TOVARY a, PRODAZHI b
WHERE a.kod_tovara=b.kod_tovara
ORDER BY b.Cena_prodazhi-a.Stoimost

В универе в аудитории поменял тип данных для “Stoimost” и “Cena_prodazhi” на float прямо в SQL Servere в пару кликов, и доля в процентах успешно посчиталась (надеюсь что и экономически всё верно). Но дома SQL Server не разрешает изменять тип данных, говорит удалите таблицу и заново создайте. Может я что-то не так делаю?

Осталось разобраться с 7 и 9 запросами.
Прикрепляю БД. Описание предметной области на всякий случай тоже упаковал в архив.
Запросы.rar

Добрые люди, помогите пожалуйста, сил уже нет сидеть и голову ломать с этими запросами..
По возможности, обязательно отблагодарю на киви!

P.S. Если получится то и этот можно тоже разобрать , но для него я так понимаю нужно новую таблицу (БРАК) создавать…. обновлять модели в эрвине…. перескринивать всё это дело в отчет…..

SQL
1
10. Получить перечень и общее количество бракованного товара, пришедшего за определенный период и список поставщиков, поставивших товар.

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

vipin tp's user avatar

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ரதீப்'s user avatar

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 Velykyy's user avatar

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

DirkNM's user avatar

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

Ajay2707's user avatar

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

Shantanu's user avatar

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;

Это не похоже на работу. Чего не хватает?

Заранее спасибо!

Добавить комментарий