[英]Sql query with multiple sub query
我正在尝试执行一个SQL查询,这将帮助我实现以下结果:
----------------------------------------------------------------------------
| RowNum | email | point_1 | point_2 | total_point |
----------------------------------------------------------------------------
| 1 | abc@gmail.com | 120 | 70 | 190 |
----------------------------------------------------------------------------
SQL查询语句1(获取RowNum,email和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 = 'abc@gmail.com'
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 = 'abc@gmail.com'
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 = 'abc@gmail.com'
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 = 'abc@gmail.com'
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列?
提前致谢
如果我正确理解了您的问题(并且假设您不使用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
语句更改为使用<
和>=
。 这种方法出现问题的机会更少。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.