2016-10-16 3 views
0
with 
cte1 as(
    select sts.user_id,u.username,sts.target,sts.from_date,sts.to_date 
    from sales_target_settings sts 
    left join users u on sts.user_id=u.id 
    order by sts.id 
      ), 
    cte2 as (
      select count(*) as tot,se.assign_to_id 
    from sales_enquiry se 
    left join cte1 on se.assign_to_id=cte1.user_id 
    where se.enq_date between cte1.from_date and cte1.to_date 
    group by se.assign_to_id) 

    select cte1.user_id,cte1.username,cte1.target,cte1.from_date,cte1.to_date,coalesce(cte2.tot,0) as total,case when (cte1.target-coalesce(cte2.tot,0))>0 then cte1.target-coalesce(cte2.tot,0) else 0 end as balance 
    from cte1 left join cte2 on cte1.user_id=cte2.assign_to_id 
    order by cte1.username ; 

OUTPUT ВЫХОДВозврат Дубликат значение Postgresql запроса

Первая таблица sales_target_settings' columns идентификатор_пользователя целевой , FROM_DATE , to_date`

второй таблицы sales_enquiry столбцы enq_date, assign_to_id.

Я хочу, чтобы суммарный запрос рассчитывался для каждого пользователя, где дата запроса между from_date и to_date из таблицы sales_target_settings.

От выхода для идентификатора пользователя 111 общее значение 6. Фактически дата между 2016-10-01 и 2016-10-31 общая стоимость для пользователя 1116 верна, но дата между 2016-09-01 и 2016-09-30 общая стоимость 0. Как решить эту проблему. Я думаю, что запрос не проверяет дату между 2016-09-01 в 2016-09-30 для пользователя 111

+3

Очень трудно помочь, если вы не описываете таблицы, связанные и не запрашивайте данные. См. [Советы по заданию хорошего вопроса о структурированном запросе языка (SQL)] (http://meta.stackoverflow.com/a/271056/4955425). – sstan

+0

Пожалуйста, добавьте эту информацию как отредактировать свой вопрос, а не в комментарии. Это позволит вам форматировать информацию более читаемым образом. – sstan

+0

Примечание: 'порядок по sts.id' в CTE или подзапросе не имеет смысла. – wildplasser

ответ

1

После просмотра в запрос SQL, вот мое наблюдение

with cte1 as(
select sts.user_id,u.username,sts.target,sts.from_date,sts.to_date 
from sales_target_settings sts 
left join users u on sts.user_id=u.id 
order by sts.id), 

------------------------------------------- this cte1 is returning two rows with two different from_date and to_date for userid = 111 
cte2 as (
     select count(*) as tot,se.assign_to_id , 
-------------------------------------------- add cte1.from_date, cte1.to_date to cte2 
     cte1.from_date, cte1.to_date 
------------- 
from sales_enquiry se 
left join cte1 on se.assign_to_id=cte1.user_id 
where se.enq_date between cte1.from_date and cte1.to_date 
group by se.assign_to_id,cte1.from_date, cte1.to_date) 

-------------------------------------------- this cte2 is returning one row for 111 

select cte1.user_id,cte1.username,cte1.target,cte1.from_date,cte1.to_date,coalesce(cte2.tot,0) as total,case when (cte1.target-coalesce(cte2.tot,0))>0 then cte1.target-coalesce(cte2.tot,0) else 0 end as balance 
from 

------------------------------------------ You are joining cte1 and cte2 only the basis of user_id. Instead of doing that add two more condition two join those cte1 and cte2 
cte1 
left join cte2 on 
cte1.user_id=cte2.assign_to_id 
and cte1.from_date = cte2.from_date 
and cte1.to_date = cte2.to_date 

order by cte1.username ; 
+0

только user_id уникален. .. can not join more coulumns – Bipin

+0

Вы попробовали вышеуказанный запрос, который я написал? –

+0

Да .. Но не используется – Bipin

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