Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Использование оператора case в SQLite / 4 сообщений из 4, страница 1 из 1
25.03.2017, 20:06
    #39427103
EITKpoll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оператора case в SQLite
Я написал запрос для вычисления процентного соотношения количества строк [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
26.03.2017, 06:17
    #39427202
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оператора case в SQLite
EITKpollНикак не могу выражение (count(country) - 1)/count(country) умножить на 100 и округлить до первого знака после запятой.
( (100.0 * (count(country) - 1)) / count(country) ) || ' %'
...
Рейтинг: 0 / 0
26.03.2017, 08:01
    #39427206
EITKpoll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оператора case в SQLite
White Owl( (100.0 * (count(country) - 1)) / count(country) ) || ' %'

Я добавил ROUND. Теперь, то что надо.
Код: sql
1.
ROUND((100.0 * (count(country) - 1)/ count(country)),1) || ' %'
...
Рейтинг: 0 / 0
09.04.2017, 00:36
    #39435321
EITKpoll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оператора case в SQLite
Мне пришлось вернуться к этому вопросу о доли от общего количества.
Код: 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
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Использование оператора case в SQLite / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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