Снежинка SQL Подсчет и суммирование из другой таблицы на основе сопоставления значений - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь выполнить SQL-запрос в снежинке, чтобы подсчитать значения из другой таблицы на основе значения из первой таблицы. Например, я нахожу значение, которое совпадает с таблицами table1 и table2, и подсчитываю соответствующие ему строки из таблицы 2.

Когда я пытаюсь это сделать, запрос выполняется, но полученные данные неправильно подсчитываются. Похоже, что он делает какой-то нечетный прорыв / совокупный подсчет. Я пытался читать примеры и гуглить для примеров, подобных этому, но что интересно, в SQL без снежинок, примеры, которые я видел, не должны «группировать» по количеству, которое я пытаюсь выбрать.

В снежинке это выдает мне ошибку, если я не сгруппирую (выберите count () из ... Но выполнение этого, похоже, возвращает результат, который слишком много подсчитывает / суммирует значение, когдаЯ удаляю это (выберите count () ... row и group by, он делает все остальное правильно, поэтому я предполагаю, что там что-то определенно не так.

select 
    "naming_db"."public"."username".name as "Name",
    "naming_db"."public"."addresses".address as "Address",
    count(*) as "Shoe Count",
    (select count(*) from "data_db"."records"."orderID" where 
    "data_db"."records"."orderID".ID = "data_db"."records"."userinfo".ID) as "Orders",
    sum("data_db"."records"."userinfo".revenue) as "Spend"
from "data_db"."records"."userinfo"
    join "naming_db"."public"."username" on "naming_db"."public"."username".name = "data_db"."records"."userinfo".nameid
    join "naming_db"."public"."addresses" on "naming_db"."public"."addresses".address = "data_db"."records"."userinfo".addressid
    full join "data_db"."records"."orderID" on "data_db"."records"."userinfo".ID = "data_db"."records"."orderID".ID
group by 1,2,4

((выберите количество (*) из ... строки Я думаю, что это проблема, но я не могу понять, как написать ее так, чтобы запрос выполнялся и возвращал результаты, которые я хочу.

Просто отредактировал запрос, чтобы сделать его более понятным. Пытался запутать некоторую информацию там, но я понял, что это слишком запутанно, извините!

Вот результаты, которые я хотел бы получить. Я получаю это, когда удаляюСтрока «Заказы» - та, которая есть (выберите количество (*) из ...

Правильные, но отсутствующие заказы

Вот результаты, которые я получаю, когдаЯ добавляю в эту строку для «Заказы»: Неправильное суммирование и разрывы oно больше строк

Ответы [ 3 ]

1 голос
/ 23 октября 2019

После того, как вы реорганизовали запрос, похоже, что у вас есть:

  1. userinfo - это таблица Пользователь , которая содержит одну строку на пользователя и также имеет накопленную сумму доходана пользователя
  2. orderID - это таблица Заказ с количествами на клиента на продукт
  3. username и addresses используются только для отображения контактной информации пользователя (неважно).

До сих пор трудно понять, что должны показать ваши агрегаты, поэтому я попытался угадать:

  1. Количество обуви в синий в вашем исправленном запросе. Он подсчитывает количество накопленных строк на пользователя, которое теперь является количеством строк заказа. Данные об обуви раньше были в запросе, но вы удалили их, поэтому Количество обуви не имеет смысла.
  2. Заказы Скорее всего, это общее количество заказов запользователь, а также количество строк в таблице заказов для этого пользователя. Но нет никакой разницы с счетчиком обуви , что заставляет меня задуматься, почему.
  3. Расход - это доход на пользователя.

использование FULL JOIN сбивает с толку. Это указывает на то, что некоторые заказы предназначены для незарегистрированных пользователей - их нет в таблице userinfo. Это не имеет смысла для меня. Ваши примеры показывают, что все заказы поступают от пользователей в userinfo, поэтому не требуется FULL JOIN.
Зачем вам это нужно?

Решение должно быть действительно простым. Пожалуйста, сообщите мне, если я не понял ваших требований:

SELECT
  ANY_VALUE(n.name) AS "Name",
  ANY_VALUE(a.address) AS "Address",
  COUNT(*) AS "Shoe Count", 
  COUNT(o.ID) AS "Orders",
  ANY_VALUE(u.revenue) AS "Spend"
FROM "data_db"."records"."userinfo" u
INNER JOIN "naming_db"."public"."username" n ON n.name = u.nameid
INNER JOIN "naming_db"."public"."addresses" a ON a.address = u.addressid
INNER JOIN "data_db"."records"."orderID" o ON o.ID = u.ID
GROUP BY u.ID
0 голосов
/ 23 октября 2019

Ваш подвыбор - это коррелированный подзапрос, для которого снег имеет ограниченную поддержку. Так что, если вы поворачиваетесь к CTE, который подсчитывает все ID, присоединитесь к нему, и вы получите то, что вы просите.

WITH order_counts AS (
    SELECT ID, count(*) as count data_db.records.orderID group by 1
)
select 
    un.name as Name,
    a.address as Address,
    count(*) as Shoe Count,
    oc.count as Orders,
    sum(ui.revenue) as Spend
from data_db.records.userinfo as ui
join naming_db.public.username as un
    on un.name = ui.nameid
join naming_db.public.addresses as a
    on a.address = ui.addressid
left join order_counts as oc
    on ui.ID = oc.ID
group by 1,2,4

Я также вставил некоторые псевдонимы, чтобы SQL былболее читабельно.

0 голосов
/ 23 октября 2019

вы можете использовать sum() вместо subquery на вашей column обуви.

select 
    "table1".name as "Name",
    "table1".address as "Address",
    count(*) as "Counts",
    sum(case when coalesce("table3".shoeID, 0) != 0 then 1 else 0 end) as "Shoes",
    sum("table2".shoecount) as "Number of Shoes"
from "table2"
join "table1" on "table1".name = "table2".name
join "table1" on "table1".Address = "table2".Address
full join "table3" on "table3".shoeID = "table2".shoeID
group by 1,2,4
...