0

表概述:

2列

i_trans_to 和 i_trans_amnt

i_trans_to 由 ID 组成, i_trans_amnt 由用户存入账户的金额组成

用户只能存入这些金额 300,175,75,40,20(因此 i_trans_amnt 列将仅包含这些值)

IDS 可能有多个条目,因为用户可以多次存款。

我想要一个将选择的查询

1.所有存款总额大于500的用户

2.在所有这些用户中,查询必须说明他做了多少种条目(例如:5 个 300 卢比的条目和 2 个 175 卢比的条目)

我成功地设计了查询,除了用户必须存入超过 rs.500 的约束,这是查询

    SELECT DISTINCT i_trans_to, 
                SUM( i_trans_amnt ),
                (SELECT COUNT(*) 
                 FROM transac 
                 WHERE i_trans_amnt=300 AND transac.i_trans_to=current.i_trans_to) AS level1,
                 (SELECT COUNT(*) 
                 FROM transac 
                 WHERE i_trans_amnt=175 AND transac.i_trans_to=current.i_trans_to) AS level2,
                 (SELECT COUNT(*) 
                 FROM transac 
                 WHERE i_trans_amnt=75 AND transac.i_trans_to=current.i_trans_to) AS level3,
                 (SELECT COUNT(*) 
                 FROM transac 
                 WHERE i_trans_amnt=40 AND transac.i_trans_to=current.i_trans_to) AS level4,
                 (SELECT COUNT(*) 
                 FROM transac 
                 WHERE i_trans_amnt=40 AND transac.i_trans_to=current.i_trans_to) AS level5,
                 (SELECT COUNT(*) 
                 FROM transac 
                 WHERE i_trans_amnt=20 AND transac.i_trans_to=current.i_trans_to) AS level6
FROM transac as current
WHERE SUM( current.i_trans_amnt )>500
GROUP BY i_trans_to

我尝试在查询末尾添加一个 where 子句,其中我写了 SUM(i_trans_amnt)> 500 但这给了我一个错误。

有什么建议么?

4

3 回答 3

1

我已经更改了您的查询,您可以level使用一组案例语句获取总数,这将加快您的查询速度。

SUM( i_trans_amount)可以在HAVING子句中检查,有关此的详细信息,请参阅 Sylvain Leroux 答案

SELECT 
    i_trans_to, 
    SUM( i_trans_amnt ),
    count(CASE WHEN i_trans_amnt=300 THEN 1 END ) AS level1,
    count(CASE WHEN i_trans_amnt=175 THEN 1 END ) AS level2,
    count(CASE WHEN i_trans_amnt=75 THEN 1 END ) AS level3           
FROM 
    transac as current
HAVING
    SUM( i_trans_amnt ) > 500
GROUP BY 
    i_trans_to
于 2013-08-10T13:28:39.040 回答
0

请参阅WHERE 与 HAVING (请在该帖子上注明 Quassnoi以获得此答案)

WHERE 在 GROUP BY 之前应用,HAVING 在之后应用(并且可以过滤聚合)。

聚合函数是SUM()COUNT()以及所有在行组上工作的函数:http: //dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

于 2013-08-10T13:28:20.443 回答
0

我编写了这个查询,首先进行了一个查询,列出了所有存款总和超过 500 amnt 的 ID。然后我在连接中使用该查询来只保留那些(所有其他 ID 都不会通过 JOIN 条件)。然后我简单地在两列上进行分组,以便能够显示每个 ID、每个金额、存款的数量。

SELECT
  transac.i_trans_to,
  transac.i_trans_amnt,
  COUNT(0) AS number_of_times_amount_was_deposited
FROM
  transac
  JOIN (
    SELECT
      i_trans_to
    FROM
      transac
    GROUP BY
      i_trans_to
    HAVING
      SUM(i_trans_amnt) > 500
  ) AS large_depositors ON transac.i_trans_to = large_depositors.i_trans_to
GROUP BY
  i_trans_to,
  i_trans_amnt
于 2013-08-10T13:07:33.433 回答