Как получить соотношение столбца X к столбцу Y в SQLlite? - PullRequest
3 голосов
/ 27 марта 2019

Я должен получить следующий результат: Демография: соотношение мужчин и женщин Напишите запрос, который показывает соотношение мужчин и женщин (pop_male, поделенное на pop_female) в возрасте старше 18 лет по округам в 2018 году. Закажите результаты по большинству женских и большинства мужских округов.

county  ratio
0   MADERA  0.909718
1   YOLO    0.932634
2   CONTRA COSTA    0.936229
3   SACRAMENTO  0.943243
4   SHASTA  0.944123

Этот предварительный просмотр ограничен пятью строками.

Выбор * из совокупности показывает базовые данные в этом формате:

    fips    county  year    age pop_female  pop_male    pop_total
0   6001    ALAMEDA 1970    0   8533    8671    17204
1   6001    ALAMEDA 1970    1   8151    8252    16403
2   6001    ALAMEDA 1970    2   7753    8015    15768
3   6001    ALAMEDA 1970    3   8018    8412    16430
4   6001    ALAMEDA 1970    4   8551    8648    17199

..... и так далее в возрасте от 0 до 100 лет за все годы 1970–2018 гг. Состояние CA

Я пытался использовать:

select county, (sum(pop_male) / sum(pop_female)) as ratio
from population group by county, year having age > 18 and year = 2018;

вывод был вместо:

 county ratio
ALAMEDA 0
ALPINE  1
AMADOR  1
BUTTE   0
CALAVERAS  0
COLUSA  1
CONTRA COSTA   0

Примечание. Мне известно, что я еще не выполнил какой-либо заказ, поскольку я даже не выводил правильные данные.

SQLRaptor дал мне предложение, и я попытался:

select county, (CAST(sum(pop_male) AS DECIMAL(1,6)) / (CAST(sum(pop_female) AS DECIMAL(1,6)) as ratio
from population group by county, year having age > 18 and year = 2018 

это дало мне ответ:

SQLite: ///../Databases/population.sqlite3 (sqlite3.OperationalError) возле "as": синтаксическая ошибка [SQL: выберите округ, (CAST (сумма (pop_male) как десятичный (1,6)) / (CAST (сумма (pop_female) как десятичный (1,6)) как отношение от группы населения по округам, год, имеющий возраст> 18 и год = 2018]

Я принял предложение Эстебана П и использовал:

выберите округ, (SUM (CAST (pop_male AS float)) / SUM (CAST (pop_female AS float))) как соотношение из группы населения по округам, год, имеющий возраст> 18 лет, и год = 2018 год по соотношению

Это сработало.

1 Ответ

4 голосов
/ 27 марта 2019

Не хочу переопределять полезный ответ SQLRaptor в комментариях, но ради полноты:)

SQL рассматривает целочисленное деление как целое число, поэтому его усекает.Чтобы избежать этого - приведите хотя бы одно из значений к типу данных с плавающей запятой (например, REAL или FLOAT для SQLite - посмотрите руководство по типам данных здесь: https://www.sqlite.org/datatype3.html)

...