powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Использование оператора case в SQLite
4 сообщений из 4, страница 1 из 1
Использование оператора case в SQLite
    #39427103
EITKpoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я написал запрос для вычисления процентного соотношения количества строк [country] минус 1 к общему количеству этих строк. Также если при выборе существуют строки [cc] со значениями WO, EP, EA, OA, AP, GC -- [prc] должно принимать значение [100%].
Таблица формируется так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
   CREATE TABLE [patent_country] (
  [id_patent_country] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
  [id_patent] INTEGER, 
  [country] VARCHAR,
  [cc] VARCHAR)
  
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (1,	'DE',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (2,	'AU',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (2,	'DE',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (2,	'WO',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (3,	'DE',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (4,	'RU',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (5,	'RU',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (6,	'RU',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (7,	'RU',	'AU');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (8,	'AU',	'WO');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (9,	'CN',	'WO');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (9,	'DE',	'WO');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (9,	'DK',	'WO');
  INSERT INTO patent_country (id_patent, country, cc)
  VALUES (9,	'EP',	'WO');


Запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select  cc,
		case 
			when cc = 'WO' 
			then '100%'
			when cc = 'EP' 
			then '100%'
			when cc = 'EA' 
			then '100%'
			when cc = 'OA' 
			then '100%'
			when cc = 'AP' 
			then '100%'
			when cc = 'GC' 
			then '100%'
			else (count(country) - 1)/count(country) || ' ' || '%'
			end as prc
		from patent_country
group by cc


Никак не могу выражение (count(country) - 1)/count(country) умножить на 100 и округлить до первого знака после запятой.
Результат моего запроса выглядит так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
| cc       |   prc    |
 ---------------------|
| AU       | 0,88888  |
 ---------------------|
| WO       | 100 %    |
 ---------------------|
| OA       | 100 %    |
 ---------------------|
| EP       | 100 %    |
 ---------------------
Нужно чтобы было так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
| cc       |   prc    |
 ---------------------|
| AU       | 88,8 %   |
 ---------------------|
| WO       | 100 %    |
 ---------------------|
| OA       | 100 %    |
 ---------------------|
| EP       | 100 %    |
 ---------------------
...
Рейтинг: 0 / 0
Использование оператора case в SQLite
    #39427202
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EITKpollНикак не могу выражение (count(country) - 1)/count(country) умножить на 100 и округлить до первого знака после запятой.
( (100.0 * (count(country) - 1)) / count(country) ) || ' %'
...
Рейтинг: 0 / 0
Использование оператора case в SQLite
    #39427206
EITKpoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl( (100.0 * (count(country) - 1)) / count(country) ) || ' %'

Я добавил ROUND. Теперь, то что надо.
Код: sql
1.
ROUND((100.0 * (count(country) - 1)/ count(country)),1) || ' %'
...
Рейтинг: 0 / 0
Использование оператора case в SQLite
    #39435321
EITKpoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне пришлось вернуться к этому вопросу о доли от общего количества.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select cc,
			case 
			when cc IN ('WO','EP','EA','OA','AP','GC')
			then '100'
			when cc = country
			then round((100.0 * count(country)/(count(cc))),1)
			else round((100.0 * (count(country) - 1)/ count(country)),1)
			end as prc
		from patent_country
group by cc;



Проверил результат запроса, используя ручку и бумагу. Я обнаружил, что не учёл момент, когда ячейки [cc] и [country] совпадают в группе. И ещё не учёл, когда в группе могут быть совпадающий один [cc] и один [country], в этом случае [prc] должен быть 0. А если одиночные [cc] и [country] не совпадают, тогда [prc] должен быть 100.
Надо как-то из [count(country)] вычитать совпадающие [cc], далее делить на count(cc) и умножать на 100. Можно ли перезаписать таблицу [patent_country], сгруппировав [group by cc], и заменив ячейки в [country] на NULL, а потом использовать [where (country is not null)] для подсчёта [count(country)]. Не сочтите за бред.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Использование оператора case в SQLite
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]