我试图在这里按多列分组-每张桌子上一列。
在这种情况下,我想通过将每个客户的当前投资组合和现金加在一起来找到每个客户的最高投资组合价值,但是一个客户可能拥有多个投资组合,因此我需要每个客户的最高投资组合。
目前,在下面的代码中,我会为每个客户的顶级投资组合多次获得相同的客户(而不是按客户ID分组)。
SELECT clients.id, clients.name, portfolios.id, SUM ( portfolios.portfolio + portfolios.cash ) AS total
FROM clients, portfolios
WHERE clients.id = portfolios.client_id
GROUP BY portfolios.id, clients.id
ORDER BY total DESC
LIMIT 30
首先,让我们做一些测试数据:
create table client (client_id integer not null primary key auto_increment,
name varchar(64));
create table portfolio (portfolio_id integer not null primary key auto_increment,
client_id integer references client.id,
cash decimal(10,2),
stocks decimal(10,2));
insert into client (name) values ('John Doe'), ('Jane Doe');
insert into portfolio (client_id, cash, stocks) values (1, 11.11, 22.22),
(1, 10.11, 23.22),
(2, 30.30, 40.40),
(2, 40.40, 50.50);
如果您不需要投资组合ID,这很容易:
select client_id, name, max(cash + stocks)
from client join portfolio using (client_id)
group by client_id
+-----------+----------+--------------------+
| client_id | name | max(cash + stocks) |
+-----------+----------+--------------------+
| 1 | John Doe | 33.33 |
| 2 | Jane Doe | 90.90 |
+-----------+----------+--------------------+
由于您需要投资组合ID,因此事情变得更加复杂。让我们逐步进行。首先,我们将编写一个子查询,该子查询返回每个客户的最大投资组合值:
select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id
+-----------+----------+
| client_id | maxtotal |
+-----------+----------+
| 1 | 33.33 |
| 2 | 90.90 |
+-----------+----------+
然后,我们将查询投资组合表,但要使用上一个子查询的联接,以仅保留那些总价值对客户而言最大的投资组合:
select portfolio_id, cash + stocks from portfolio
join (select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal
+--------------+---------------+
| portfolio_id | cash + stocks |
+--------------+---------------+
| 5 | 33.33 |
| 6 | 33.33 |
| 8 | 90.90 |
+--------------+---------------+
最后,我们可以连接到客户表(就像您所做的那样),以便包括每个客户的名称:
select client_id, name, portfolio_id, cash + stocks
from client
join portfolio using (client_id)
join (select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal
+-----------+----------+--------------+---------------+
| client_id | name | portfolio_id | cash + stocks |
+-----------+----------+--------------+---------------+
| 1 | John Doe | 5 | 33.33 |
| 1 | John Doe | 6 | 33.33 |
| 2 | Jane Doe | 8 | 90.90 |
+-----------+----------+--------------+---------------+
请注意,这将返回John Doe的两行,因为他有两个总价值完全相同的投资组合。为了避免这种情况并选择任意的顶级投资组合,请在GROUP BY子句上进行标记:
select client_id, name, portfolio_id, cash + stocks
from client
join portfolio using (client_id)
join (select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal
group by client_id, cash + stocks
+-----------+----------+--------------+---------------+
| client_id | name | portfolio_id | cash + stocks |
+-----------+----------+--------------+---------------+
| 1 | John Doe | 5 | 33.33 |
| 2 | Jane Doe | 8 | 90.90 |
+-----------+----------+--------------+---------------+
我有两个表,分别是产品和采购: PRODUCTS表-将获得购买的所有新产品。这意味着表prroducts中不存在相同的productname。所有独特产品列表 采购表-具有唯一purchase_id的所有采购产品的列表。 > 如果要在PURCHASE中添加或插入值,表PRODUCTS将获得PURCHASE的所有值,但前提是PURCHASE中的productname不存在于PRODUCTS中的'pr
问题内容: 我有下表: 我想对两列(No1,No2)的分区求和,但是当两列中的值更改时,它也应该分组。示例为:AB = BA 这将是我的预期结果: 有任何想法吗? 问题答案: 使用和。
问题内容: 查询1: 查询2: 我想将两个结果合并为两列,其中缺少一列=查询2-查询1以加快处理速度。我该怎么做?示例: 我有两个结果: // ----------------------------------------查询:1 1 2 3 4 // --------------------------------------查询:2 4 5 6 8 // ------------------
问题内容: 显然已弃用。 考虑到JUnit的广泛使用,令人惊讶地缺少JUnit的javadocs。你能告诉我如何使用新的吗? 问题答案: Epsilon是您的“模糊因素”,因为双精度可能并不完全相等。Epsilon让您描述它们之间必须有多近。 如果您期望的是3.14159,但需要花费3.14059至3.14259(即0.001以内),那么您应该编写类似 (顺便说一句,22/7达到3.1428+,将
我的桌子有这样的结构 如何在mysql中获取上述数据的两个日期之间的事件(日期比较与年份无关)。例如,如果start_date是2014-05-01,结束日期是2014-05-20,则输出应该是 更新:如果同一个人的结婚日期和出生日期都在提供的日期范围内,则输出应包含该人的两列 (抱歉我的英语不好)
问题内容: 我有两个列表和数字,我想使用相同的指令遍历它们。像这样: 但这感觉多余。我知道我会写,但是要付出一定的时间。 有没有办法做到这一点而又不浪费时间呢? 问题答案: 这可以通过以下方式完成 : 将打印: 根据文档,请执行以下操作: 创建一个迭代器,该迭代器从第一个可迭代对象返回元素,直到耗尽为止,然后继续进行下一个可迭代对象,直到所有可迭代对象都耗尽为止。 如果列表中有列表, 则可用: 产