Запросы агрегации - PullRequest
       6

Запросы агрегации

0 голосов
/ 26 августа 2018

Можно ли выполнить следующий запрос в SQLite.Swift, не прибегая к произвольному SQL (который у меня работает, но я бы предпочел этого избежать)?

select table1.id, sum(table1.col1*table2.col2)
from table1, table2
where table1.id=table2.id
group by table1.id

Я попытался сделать следующее: SQL (через asSQL()) кажется правильным, но я не могу найти способ ссылки на столбец агрегата из возвращенной строки.

let query = table1.select(id, (table1[column1]*table2[column2]).sum
            .join(table2, on: table1[id] == table2[id])
            .group(id)

Можно ли как-нибудь использовать псевдоним столбцов?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

ОК, я нашел решение, и это заняло у меня всего 2 дня!

Чтобы создать псевдоним столбца в SQLite.swift, нужно использовать выражение.Имя выражения становится псевдонимом столбца.

Поэтому вместо

let query = table1.select(id, (table1[column1]*table2[column2]).sum)
            .join(table2, on: table1[id] == table2[id])
            .group(id)

Использовать:

let aggrColumn = (table1[column1]*table2[column2]).sum
let query = table1.select(id, aggrColumn)
            .join(table2, on: table1[id] == table2[id])
            .group(id)
let results = try db.prepare(query)
for row in results {
    myAggrColumn = try row.get(aggrColumn)
}
0 голосов
/ 27 августа 2018

Использование

select id, sum(table1.col1*table2.col2)
from table1, table2
were table1.id=table2.id
group by id

В результате ( см. Ниже исправления ) в 2 столбцах, а именно: id и sum (table1, col * table2.col2)

Однако оба использования идентификатора были бы неоднозначными, поскольку закодированы, поскольку существует два таких исходных столбца.Таким образом, запрос должен быть изменен ( см. Следующий код , который предполагает, что вы хотите получить идентификатор из таблицы1 (не должно иметь значения, если таблица2 использовалась из-за объединения))

Дополнительно were не является ключевым словом, оно должно быть WHERE

Псевдоним может упростить процесс создания псевдонима с помощью AS ключевое слово.Фолловинг также включает AS mysumcolumn, поэтому результирующие столбцы будут id и mysumcolumn

select table1.id, sum(table1.col1*table2.col2) AS mysumcolumn
from table1, table2
where table1.id=table2.id
group by table1.id

Запуск без данных приводит к: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...