2016-06-14 2 views
0

Я пытаюсь извлечь некоторые данные, сгруппированные на рынках, где мы работаем Структура таблицы выглядит следующим образом:запрессовки на нескольких столах вызывает неправильные результаты

bks: 
opportunity_id 

bks_opps: 
opportunity_id | trip_start | state 

bts: 
boat_id | package_id 

pckgs: 
package_id | boat_id 

addresses: 
addressable_id | district_id 

districts: 
district_id 

То, что я хотел сделать, это подсчитать количество выиграл, проиграл, и общий процент выиграл для каждого района.

SELECT   d.name AS "District", 
       SUM(CASE WHEN bo.state IN ('won') THEN 1 ELSE 0 END) AS "Won", 
       SUM(CASE WHEN bo.state IN ('lost') THEN 1 ELSE 0 END) AS "Lost", 
       Count(bo.state) AS "Total", 
       Round(100 * SUM(CASE WHEN bo.state IN ('won') THEN 1 ELSE 0 END)/Count(bo.state)) AS "% Won"    
FROM bks b 
INNER JOIN bks_opps bo ON bo.id = b.opportunity_id 
INNER JOIN pckgs p ON p.id = b.package_id 
INNER JOIN bts bt ON bt.id = p.boat_id 
INNER JOIN addresses a ON a.addressable_type = 'Boat' AND a.addressable_id = bt.id 
INNER JOIN districts d ON d.id = a.district_id 
WHERE bo.trip_start BETWEEN '2016-05-12' AND '2016-06-12' 
GROUP BY d.name; 

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

Пример данных:

District | won | lost | total 
----+---------+---------+------ 

    1 |  42 | 212 | 254 

Ожидаемые данные:

District | won | lost | total | 
     ----+---------+---------+-- 
     1 | 22 | 155 | 177 
+0

начать с 'select separate' –

+0

Все еще не работает .... – DBE7

+0

Вы должны предоставить пример данных, чтобы иметь возможность воспроизвести вашу проблему. –

ответ

2

отформатированный комментарий:

Рискну предположить, что один из ваших условий соединения виноват здесь, но с предоставленную структуру невозможно сказать.

Например, у вас есть это соединение INNER JOIN pckgs p ON p.id = b.package_id, но package_id не указана в качестве столбца в bks.

И это присоединяется выглядеть особенно подозреваемый:

INNER JOIN pckgs p ON p.id = b.package_id 
INNER JOIN bts bt ON bt.id = p.boat_id 

Если лодка может существовать в нескольких пакетах, это будет проблемой.

Чтобы устранить, начните с самого простого запроса вы можете:

SELECT b.opportunity_id 
FROM bks b 

Затем оставьте выберите один, и продолжить добавлять в каждый присоединиться:

SELECT b.opportunity_id 
FROM bks b 
INNER JOIN pckgs p ON p.id = b.package_id 

В какой-то момент вы, вероятно, см. скачок количества возвращенных строк. В любом случае вы добавили последний вопрос.

+0

package_id на самом деле является столбцом в bks. – DBE7

+1

@ DavidBentzon-Ehlers О, я тебе верю. Я просто указываю, что существует хотя бы одно отношение, которое для нас не определено четко. Попробуйте предлагать рекомендации по устранению неполадок и отчитываться, если количество возвращаемых строк будет изменяться. –

+0

Нет присоединяется = 3789 1 присоединиться = 37833 2 присоединяется = 37833 3 соединяет = 37833 4 присоединяется = 3778 5 присоединяется = 37769 – DBE7

Смежные вопросы