没有循环的SQL的最佳解决方案

时间:2013-12-05 19:50:12

标签: sql

我对SQL比较陌生,我正试图找到解决此问题的最佳方法。

我正在尝试从2个表中获取数据并开始将它们合并在一起以对其进行分析,但我不知道在没有循环或许多嵌套子查询的情况下最好的方法。

到目前为止我做了什么: 我有2张桌子。表1包含用户信息,表2包含订单信息(价格和日期,以及用户)

我需要做什么: 我想为每个用户提供一行,其中包含有关所有订单的信息摘要。我希望找到每个用户的所有订单的价格总和,该用户支付的最高价格以及订单数量。我不确定如何在SQL中最好地操纵我的数据。

目前,我的代码如下:

Select alias1.*, Table2.order_id, Table2.price, Table2.order_date
From (Select * from Table1 where country='United States') as alias1
LEFT JOIN Table2
on alias1.user_id = Table2.user_id

按国家/地区过滤掉数据类型,然后将其与用户连接,创建包含用户信息的每个订单的记录。我不知道这是否是一个有用的步骤,但这是我第一次尝试使用数据的一部分。我在考虑循环这个,但我知道这违背了SQL的精神

编辑:这是我拥有的和我想要的一个例子:

表1(用户信息):

user_id    user_country
1          United States
2          United Kingdom
(etc)

表2(订单信息):

order_id    price    user_id
100         5.00     1
101         3.50     2
102         2.50     1
103         1.00     1
104         8.00     2

我想要输出的内容:

user_id    user_country      total_price   max_price    number_of_orders
1          United States     8.50          5.00         3
2          United Kingdom    11.50         8.00         2

4 个答案:

答案 0 :(得分:2)

这是实现此目的的一种方法:

SELECT    alias1.user_id, 
          MAX(alias1.user_name) As user_name,
          SUM(Table2.price)     As UsersTotalPrice,
          MAX(Table2.price)     As UsersHighestPrice
FROM      Table1                As alias1
LEFT JOIN Table2    ON alias1.user_id = Table2.user_id
WHERE     country   = 'United States'
GROUP BY  user_id

如果您能给我们实际的表定义,那么我们可以向您展示一些实际的工作查询。

答案 1 :(得分:0)

这样的东西?在表2中聚集行,然后加入表1以获取所需的详细信息?

SELECT Table1.*,agg.thesum FROM
(SELECT UserID, SUM(aggregatedata) as thesum FROM Table2 GROUP BY UserID)  agg
 INNER JOIN Table1 on table1.userid = agg.userid

答案 2 :(得分:0)

这应该有效

select table1.*, t2.total_price, t2.max_price, t2.order_count
来自table1的

join(selectt user_id,sum(table2.price)为total_price,max(table2.price)为max_price,count(order_id)为order_count,从table2为t2 group by t2.user_id) 在table1.user_id = t2.user_id上 其中t1.country ='untied_states'

答案 3 :(得分:0)

编辑:(删除:“不要使用显式连接”这是错误的,我的意思:) 尝试使用以下Sytax,以便更好地理解发生的事情:

第1步:

select 
    user.user_id,   -- < you must tell the DB userid of which column
    user_country,
    price, 
    price 
from -- now just the two tables:
    Table1 as user, --table1 is a bad name, we use 'user'
    Table2 as order
where user.user_id = order.user_id

所以你会得到类似的东西:

user_id    user_country    price    price 
1          alabama         5        5
2          nebrasca        1        1
2          alabama         7        7
1          alabama         7        7
2          alabama         3        7

依旧......

下一步是添加另一个where usercountry='alabama',以便'nebrasca'关闭

user_id    user_country    price    price 
1          alabama         5        5
2          alabama         7        7
1          alabama         7        7
2          alabama         3        7

现在你准备好了“聚合”:只需选择价格的MAX和SUM,但你必须告诉SQL引擎什么样的columes是'fixed'= group by

select 
   user.user_id, user_country, MAX(price), SUM(price) 
from 
    Table1 as user, 
    Table2 as order
where user.user_id = order.user_id
and user_country='alabama'
group by user_id, user_country