2016-08-03 2 views
0

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

---------------------------------------------------------------------------- 
| RowNum |  email  | point_1 | point_2 | total_point | 
---------------------------------------------------------------------------- 
| 1 | [email protected] |  120  |  70  |  190  | 
---------------------------------------------------------------------------- 

Sql заявление запроса 1 (чтобы получить значение RowNum, адрес электронной почты и point_1) :

$sql = " 
      select * 
      from 
      (
       select ROW_NUMBER() OVER (ORDER BY m.first_name) as **RowNum**, 
       ltrim(rtrim(m.email_addr)) AS **email**, 
       CAST(isnull(p.points_accumulated,'0') AS INT) AS **point_1** 

       FROM (select * from crm_member_list where coy_id='HSG' and mbr_id not in (select mbr_id from o2o_tmp_mbr_issues_exclude)) m 
        left join (select * from crm_member_points where coy_id='HSG') p 
        on p.mbr_id = m.mbr_id 
        where m.email_addr = '[email protected]' 

        and m.date BETWEEN '2016-08-01 00:00:00' AND '2016-08-31 23:59:00' 
       )sub where RowNum>? and RowNum<? order by RowNum"; 

заявление Sql запрос 2 (чтобы получить значение point_2):

$sql = " 
      select CAST(isnull(p.points_accumulated,'0') AS INT) AS **point_2** 
        FROM (select * from crm_member_list where coy_id='HSG' and mbr_id not in (select mbr_id from o2o_tmp_mbr_issues_exclude)) m 
          left join (select * from crm_member_points where coy_id='HSG') p 
          on p.mbr_id = m.mbr_id 
          where m.email_addr = '[email protected]' 
          and m.date BETWEEN '2016-09-01 00:00:00' AND '2016-09-30 23:59:00'"; 

Я попытался совместить 2 с приведенные выше, чтобы получить результат, но я получаю ошибку

«выполнить sql напрямую, без курсора».

Комбинированный код:

$sql = " 
       select * 
       from 
       (
        (select ROW_NUMBER() OVER (ORDER BY m.first_name) as **RowNum**, 
        ltrim(rtrim(m.email_addr)) AS **email**, 
        CAST(isnull(p.points_accumulated,'0') AS INT) AS **point_1** 

        FROM (select * from crm_member_list where coy_id='HSG' and mbr_id not in (select mbr_id from o2o_tmp_mbr_issues_exclude)) m 
         left join (select * from crm_member_points where coy_id='HSG') p 
         on p.mbr_id = m.mbr_id 
         where m.email_addr = '[email protected]' 
         and m.date BETWEEN '2016-08-01 00:00:00' AND '2016-08-31 23:59:00'), 





        (select CAST(isnull(p.points_accumulated,'0') AS INT) AS **point_2** 
        FROM (select * from crm_member_list where coy_id='HSG' and mbr_id not in (select mbr_id from o2o_tmp_mbr_issues_exclude)) m 
          left join (select * from crm_member_points where coy_id='HSG') p 
          on p.mbr_id = m.mbr_id 
          where m.email_addr = '[email protected]' 
          and m.date BETWEEN '2016-09-01 00:00:00' AND '2016-09-30 23:59:00' 
        ) 
       )sub where RowNum>? and RowNum<? order by RowNum"; 

Как я должен идти об объединении обоих утверждений запроса для создания результата, показанного выше? И как добавить столбец point_1 и point_2 для получения столбца total_point?

Заранее спасибо

+0

Это не mysql, он не поддерживает 'row_number()'. Пожалуйста, отметьте правильную СУБД. – fancyPants

ответ

0

Если я понять ваш вопрос правильно (и если вы не используете mysql, как он не поддерживает row_number), один подход будет использовать conditional aggregation. Я также думаю, что вы на самом деле хотите sum точек для каждого месяца по сравнению с выбором 1 из каждого месяца:

select *, row_number() over (order by first_name) rn 
from (
    select 
     m.first_name, 
     ltrim(rtrim(m.email_addr)) AS email, 
     sum(case when m.date >= '2016-08-01' AND m.Date < '2016-09-01' 
       then CAST(isnull(p.points_accumulated,'0') AS INT) 
      end 
      ) as point_1, 
     sum(case when m.date >= '2016-09-01' AND m.Date < '2016-10-01' 
       then CAST(isnull(p.points_accumulated,'0') AS INT) 
      end 
      ) as point_2, 
     sum(CAST(isnull(p.points_accumulated,'0') AS INT)) 
    from crm_member_list m 
     left join crm_member_points p on m.coy_id = p.coy_id 
            and p.mbr_id = m.mbr_id 
    where m.coy_id = 'HSG' 
      and m.mbr_id not in (select mbr_id from o2o_tmp_mbr_issues_exclude) 
      and m.date >= '2016-08-01' AND m.date < '2016-10-01' 
    group by 1, 2 
) t 

Пожалуйста, обратите внимание, я изменил свое between заявление использовать < и >=. Меньше шансов на проблемы с этим подходом.

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