2017-08-02 137 views
0

我有两个tabels困难,PostgreSQL的查询

用户

id | name | sex | birth 
    ---+--------+-----+------ 
    1 | User1 | 0 | 2007-07-12 
    2 | User2 | 0 | 1988-05-10 
    3 | User3 | 1 | 2000-01-11 
    4 | User4 | 1 | 1999-10-10 

而另一TABEL

为了

id | user_id | price | order_date 
--------------------------------------------- 
1 | 3  | 5 | 2017-07-10 08:01:00.000000 
2 | 3  | 6 | 2017-07-11 09:01:00.000000 
3 | 1  | 8 | 2017-07-12 10:01:00.000000 
4 | 2  | 10 | 2017-07-13 11:01:00.000000 
5 | 4  | 100 | 2017-07-14 12:01:00.000000 
6 |   | 58 | 2017-07-15 13:01:00.000000 

我需要的结果TABEL这样

为了

  |age | men_pr | women_pr| 
      |----------------------------- 
      |<18 |  8 |   | 
      |18-50 |  10 | 111  | 
      |>50 |   |   | 

与日期

WHERE 
     order.order_date >= '2017-07-01 08:01:00.000000' 
     AND order.order_date <= '2017-07-15 08:01:00.000000' 
+0

你尝试过什么,和你在哪里有困难? –

回答

1

第一等级要在生日变成年龄组:

SELECT id, 
(case when date_part('year',age(birth)) < 18 then '<18' 
     when date_part('year',age(birth)) > 50 then '>50' 
     else '18-50' end) as 
age, sex from g_user; 

,这将导致在此:

id | age | sex 
----+-------+----- 
    1 | <18 | 0 
    2 | 18-50 | 0 
    3 | <18 | 1 
    4 | <18 | 1 
(4 rows) 

我们将在内部使用q这样我们可以按照年龄段进行分组。接下来,我们需要的是将在所有年龄组(因为我们希望的是,在产量,但我们没有任何用户超过50岁)的表:

select '<18' as age union select '18-50' union select '>50'; 

我们把它放在一起,然后求和达因性别价格:

select a.age, 
     nullif(sum(case when sex = 0 then price else 0 end),0) as men_pr, 
     nullif(sum(case when sex = 1 then price else 0 end),0) as women_pr 
from (select '<18' as age union select '18-50' union select '>50') as a 
left join (SELECT id, (case when date_part('year',age(birth)) < 18 then '<18' 
     when date_part('year',age(birth)) > 50 then '>50' else '18-50' end) as 
age, sex from g_user) u on a.age = u.age 
left join g_order on u.id = user_id 
group by a.age; 

我们需要使用LEFT JOIN这里,以确保所有类别显示regardles或是否有存在于数据年龄的用户。

这是结果

age | men_pr | women_pr 
-------+---------+---------- 
<18 |  8 |  111 
18-50 |  10 | 
>50 |   | 
(3 rows) 
+0

感谢工作几乎完美。但是当我添加'WHERE order.order_date> ='2017-07-01 08:01:00.000000' AND order.order_date <='2017-07-15 08:01:00.000000''消失的行没有数据 –