从子查询 SQL 中选择最大数据,但它显示来自子查询的所有结果

Posted

技术标签:

【中文标题】从子查询 SQL 中选择最大数据,但它显示来自子查询的所有结果【英文标题】:Select Max Data from Subquery SQL, but it Show All Results from Subquery 【发布时间】:2012-09-24 09:37:59 【问题描述】:
SELECT MAX( t.valuesum ) AS total, t.codebook
FROM (
    SELECT SUM( value ) AS valuesum, codebook
    FROM stock
    GROUP BY codebook
) t
GROUP BY t.codebook

在子查询中,输出为:

b001 35,
b002 20,
b0003 11

我只想看到:b001 35。请帮帮我。

【问题讨论】:

它是我的数据库 CREATE TABLE stock ( no float NOT NULL auto_increment, codebook varchar(30) NOT NULL, value float NOT NULL, PRIMARY KEY (no) )引擎=MyISAM 默认字符集=utf8 AUTO_INCREMENT=5; -- -- dump ตาราง stock -- INSERT INTO stock VALUES (1, 'b001', 20);插入stock 值(2,'b002',10);插入stock 值(3,'b001',15);插入stock 值(4,'b003',2); 对不起。我的英语水平很差 您似乎有一个名为“值”的列?不是吗? 最好在您正在使用的 DBMS(mysql、SQL-Server、DB2 等)中添加标签。这样您会更快地得到答案。 不是全部 3 个标签!你应该使用的那个! 【参考方案1】:

使用where 条件的第一个解决方案:

SELECT t1.valuesum, t1.codebook
FROM (
        SELECT SUM( s.value ) AS valuesum, s.codebook
        FROM stock s
        GROUP BY s.codebook
     ) t1
WHERE t1.valuesum in (SELECT MAX( t2.valuesum ) AS total
                     FROM (
                             SELECT SUM( s2.value ) AS valuesum, s2.codebook
                             FROM stock s2
                             GROUP BY s2.codebook
                           )t2
                     ) 

SQL Fiddle演示

使用having 条件的第二个解决方案:

SELECT max(t1.valuesum), t1.codebook
FROM (
        SELECT SUM( s.value ) AS valuesum, s.codebook
        FROM stock s
        GROUP BY s.codebook
     ) t1
GROUP BY t1.codebook
HAVING max(t1.valuesum) = (SELECT MAX( t2.valuesum ) AS total
                     FROM (
                             SELECT SUM( s2.value ) AS valuesum, s2.codebook
                             FROM stock s2
                             GROUP BY s2.codebook
                           )t2
                     )

SQL Fiddle演示

【讨论】:

#1248 - 每个派生表都必须有自己的别名 #1054 - '字段列表'中的未知列't1.valuesum' #1241 - 操作数应包含 1 列 没关系!是的,如果我想在小组中使用小组,你可以帮助我的生活,我可以做什么 我不确定您需要什么。我添加了第二个解决方案,也许它会对你有所帮助。【参考方案2】:

试试这个

SELECT SUM( value ) AS valuesum, codebook 
FROM stock 
GROUP BY codebook
ORDER BY valuesum DESC
LIMIT 1

【讨论】:

它显示 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '1 SUM(value) AS valuessum , codebook FROM stock GROUP BY codebook ORDER BY v' 附近使用正确的语法 我忘了它是 MySql 而不是 MS SQL。编辑了我的答案。使用 Limit 1 获取前 1 行。【参考方案3】:

您可以通过单个查询简单地获取它 -

    SELECT MAX( t2.valuesum ) AS valuesum, t2.codebook
    FROM (
          SELECT SUM( s2.value ) AS valuesum, s2.codebook
          FROM stock s2
          GROUP BY s2.codebook
         )t2

演示:-http://sqlfiddle.com/#!9/c2534/15

【讨论】:

【参考方案4】:

试试这个

SELECT TOP 1 * FROM
(
  SELECT SUM([value]) AS valuesum, codebook
  FROM stock
  GROUP BY codebook
)
ORDER BY valuesum DESC

【讨论】:

1064 - 您的 SQL 语法有错误;查看对应的手册 它显示 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '1 SUM(value) AS valuessum , codebook FROM stock GROUP BY codebook ORDER BY v' 附近使用正确的语法 已编辑。请现在检查。 “价值”是一个关键字。我们应该使用 [value] 代替列名【参考方案5】:

假设(根据 cmets 和错误消息)您使用 MySQL:

SELECT SUM( value ) AS valuesum, codebook
FROM stock
GROUP BY codebook
ORDER BY valuesum DESC
  LIMIT 1 ;

【讨论】:

以上是关于从子查询 SQL 中选择最大数据,但它显示来自子查询的所有结果的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询生成器 从子查询中选择

VB.NET 中的 SQL 选择查询

SQL 从带有子查询的多个表中选择数据(包括来自内部连接的数据)错误:1242

从子查询mysql中选择数据

在 SQL Server 中,如何从子查询中标识的表列名称中检索数据值?

尝试在 Shiny 应用程序中显示来自 SQL Server 查询的数据框时出现问题