【问题标题】:Sql query with multiple sub query具有多个子查询的 Sql 查询
【发布时间】:2016-08-03 13:31:36
【问题描述】:

我正在尝试执行一个 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()。请使用正确的 DBMS 进行标记。

标签: php sql-server database


【解决方案1】:

如果我正确理解了您的问题(并假设您没有使用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 语句更改为使用 &lt;&gt;=。这种方法出现问题的可能性较小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多