SQL查询结果加入排序值的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询结果加入排序值的问题相关的知识,希望对你有一定的参考价值。

我查询出来四个字段,比如商品编码,销量,销额,毛利这四个,我希望在显示的时候显示这样几个字段,商品编码,销量,销量排名,销额,销额排名,毛利,毛利排名。
数据库是DB2的.我指导order by,那只是排序。我想要的列是某个商品的销量在所有商品中销量的排名情况,销额的排名情况,毛利的排名情况

select *
from 表
order by (select case sunxun when \'A\' then 3 when \'B\' then 1 when \'C\' then 2 when \'D\' then 4 end)

试试吧,SQL SERVER适用。
两表联合查询,再排下序就行了INNER JOIN 运算
组合两个表中的记录,只要在公共字段之中有相符的值。

语法
FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2

INNER JOIN 运算可分为以下几个部分:

部分 说明
table1, table2 记录被组合的表的名称。
field1, field2 被联接的字段的名称。若它们不是由数字构成的,则这些字段必须为相同的数据类型并包含同类数据,但它们无须具有相同的名称。
compopr 任何的关系比较运算子:"=," "<," ">," "<=," ">=," 或 "<>."

说明
可以在 FROM 子句中使用INNER JOIN运算。.这是最普通的联接类型。只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。

可以使用 INNER JOIN 与部门表及员工表选择每一个部门中的全部员工。反之,可以使用 LEFT JOIN或 RIGHT JOIN运算创建 outer join,从而选择所有部门(即使有些并没有员工)或所有员工(即使有些尚未分配到部门)。

若试图联接包含 Memo或 OLE Object数据的字段,会导致错误。

可以联接任何两个相同类型的数值字段。例如,可以联接 AutoNumber和 Long字段,因为它们类型相似。但不能联接 Single 和 Double 类型的字段。

下列示例显示如何在类标识符字段联接类表及产品表:

SELECT CategoryName, ProductName

FROM Categories INNER JOIN Products

ON Categories.CategoryID = Products.CategoryID;

在上面的示例中,类标识符是已被联接的字段,但是它并不包含在查询输出中,因它并非被包含在 SELECT 语句之中。在这个示例中,若要包含联接字段,将字段名包含在 SELECT 语句中, Categories.CategoryID.

也可以使用下列语法,在一个 JOIN 语句中链接多个 ON 子句:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2) OR
ON table1.field3 compopr table2.field3)];

也可以使用下列语法,嵌套 JOIN 语句:

SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)]
ON table3.field3 compopr tablex.fieldx)]
ON table2.field2 compopr table3.field3)
ON table1.field1 compopr table2.field2;

在一个 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。
--------------------------------------------
ORDER BY 子句
按照递增或递减顺序在指定字段中对查询的结果记录进行排序。

语法
SELECT 字段表
FROM 表
WHERE选择准则
[ORDER BY字段1 [ASC | DESC ][, 字段2 [ASC | DESC ]][, ...]]]

包含 ORDER BY 子句的 SELECT 语句具有以下几个部分:

部分 说明
fieldlist 要和任何字段名别名, SQL 合计函数s, 选择断定 (ALL, DISTINCT, DISTINCTROW或 TOP)或其他 SELECT 语句 选择一起检索的字段名称。
table 从其中获取记录的表的名称。欲知更多信息请看 FROM 子句.
selectcriteria 选择准则。如果此 语句 包含一个 WHERE 子句, Microsoft Jet数据库引擎 会在记录上应用WHERE条件,然后把值排序。
field1, field2 要排序记录的字段名。

说明
ORDER BY 是可选的。不过,如果要将数据以排序时的顺序显示出来,就必须使用 ORDER BY。

缺省排序顺序是升序 (A至 Z, 0至 9).以下两个示例都用雇员的姓对雇员姓名排序:

SELECT LastName, FirstName

FROM Employees

ORDER BY LastName;

SELECT LastName, FirstName

FROM Employees

ORDER BY LastName ASC;

为按递减顺序排序(Z 至 A,9 至0),必须将 DESC 保留字添加到要递减排序的每一字段的尾部。下例选择雇员薪金并对雇员用递减顺序排序。

SELECT LastName, Salary

FROM Employees

ORDER BY Salary DESC, LastName;

如果你在ORDER BY 子句中标明了包含 Memo或 OLE Object数据的一个字段,一个错误就产生了。Microsoft Jet 数据库引擎不对这些类型的字段排序。

ORDER BY通常是 SQL 语句中最后一项。

ORDER BY 子句可包含添加的字段。首先用 ORDER BY之后列举的第一个字段对记录排序。然后对此字段中等值的记录用第二字段列举的值进行排序,依此类推。
参考技术A create table test(
商品编码 int identity(1,1),
销量 int,
销额 int,
毛利 int
)
insert test select 2,26,77
union select 55,55,65
union select 5,35,90
union select 55,2,5
union select 54,24,2

select 商品编码,
销量,销量名次=(select count(*)+1 from test a where a.销量>b.销量),
销额,销额名次=(select count(*)+1 from test a where a.销额>b.销额),
毛利,毛利名次=(select count(*)+1 from test a where a.毛利>b.毛利) from test b
参考技术B 用 order by命令 参考技术C 用存储过程

SQL查询以选择具有最小值的不同行

【中文标题】SQL查询以选择具有最小值的不同行【英文标题】:SQL query to select distinct row with minimum value 【发布时间】:2013-02-23 20:24:48 【问题描述】:

我想要一条 SQL 语句来获取具有最小值的行。

考虑这张表:

id  game   point
1    x      5
1    z      4
2    y      6
3    x      2
3    y      5
3    z      8

如何选择在point 列中具有最小值的ID,按游戏分组?像下面这样:

id  game   point    
1    z      4
2    y      5
3    x      2   

【问题讨论】:

您需要加入同一张表才能获得所需的结果。在答案中检查下面的查询。 为什么你的结果中游戏“y”点值是 6 而不是 5? 由于 OP 没有回应,我只能假设他的意思是问“按 id 分组”,并显示哪个游戏得分最低... 【参考方案1】:

试试:

select id, game, min(point) from t
group by id 

【讨论】:

我收到此错误“列 'student.point' 在 HAVING 子句中无效,因为它不包含在聚合函数或 GROUP BY 子句中。” 这不会得到想要的结果。因为您需要将查询与 id、game、point to remove error 分组,这将返回所有记录。 对不起,我不明白。这里有什么问题:sqlfiddle.com/#!2/8b9c7/8/0 代码是:select id, game, min(point) from tablename group by id,game @Wawrzyniec - 问题是您的结果不正确。 ID 1, game z, min(point) 4 应该是正确的。【参考方案2】:

这会起作用

select * from table 
where (id,point) IN (select id,min(point) from table group by id);

【讨论】:

你使用的是哪个 rdbms? 哦!我不了解 MySQL ...该查询是子查询中的多列检查,它将在 Oracle 中工作。 好的。感谢您的支持【参考方案3】:

用途:

SELECT tbl.*
FROM TableName tbl
  INNER JOIN
  (
    SELECT Id, MIN(Point) MinPoint
    FROM TableName
    GROUP BY Id
  ) tbl1
  ON tbl1.id = tbl.id
WHERE tbl1.MinPoint = tbl.Point

【讨论】:

在Microsoft access中写SQL时可以做单个内连接吗?? 不必要的完成 SELECT id , game , MIN(point) FROM tablename GROUP BY id,game @SouravSarkar,这将不起作用该示例将返回原始查询的每一行,因为它正在寻找每个 id 游戏的最低点。 (例如,id = 1 和 game = x 的最低分数是 5;id = 1 和 game = z 的最低分数是 4) 我同意。这是不必要的。使用 Window 函数是一种更简洁的方法,并且与架构无关,也可以减少对连接的需求。 如前所述,当有两行id相同,最小值如[id, game, point] [1, x, 4][1, y, 4] 【参考方案4】:

Ken Clark's answer 在我的情况下不起作用。它也可能不适用于您的。如果没有,试试这个:

SELECT * 
from table T

INNER JOIN
  (
  select id, MIN(point) MinPoint
  from table T
  group by AccountId
  ) NewT on T.id = NewT.id and T.point = NewT.MinPoint

ORDER BY game desc

【讨论】:

【参考方案5】:
SELECT * from room
INNER JOIN
  (
  select DISTINCT hotelNo, MIN(price) MinPrice
  from room
 Group by hotelNo
  ) NewT   
 on room.hotelNo = NewT.hotelNo and room.price = NewT.MinPrice;

【讨论】:

对这段代码如何回答问题的简短解释将大大改善这个答案【参考方案6】:

由于仅使用sql 标记,以下使用ANSI SQL 和window function:

select id, game, point
from (
  select id, game, point, 
         row_number() over (partition by game order by point) as rn
  from games
) t
where rn = 1;

【讨论】:

【参考方案7】:

这是做同样事情的另一种方式,它可以让你做一些有趣的事情,比如选择前 5 名获胜的游戏等。

 SELECT *
 FROM
 (
     SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Point) as RowNum, *
     FROM Table
 ) X 
 WHERE RowNum = 1

您现在可以正确获取被识别为得分最低的实际行,并且您可以修改排序函数以使用多个标准,例如“显示得分最低的最早游戏”等。

【讨论】:

【参考方案8】:

此替代方法使用 SQL Server 的 OUTER APPLY 子句。这样,它

    创建不同的游戏列表,并 获取并输出该游戏得分最低的记录。

OUTER APPLY 子句可以想象成LEFT JOIN,但优点是您可以将主查询的值用作子查询中的参数(此处为游戏)。 p>

SELECT colMinPointID
FROM (
  SELECT game
  FROM table
  GROUP BY game
) As rstOuter
OUTER APPLY (
  SELECT TOP 1 id As colMinPointID
  FROM table As rstInner
  WHERE rstInner.game = rstOuter.game
  ORDER BY points
) AS rstMinPoints

【讨论】:

【参考方案9】:
SELECT DISTINCT 
FIRST_VALUE(ID) OVER (Partition by Game ORDER BY Point) AS ID,
Game,
FIRST_VALUE(Point) OVER (Partition by Game ORDER BY Point) AS Point
FROM #T

【讨论】:

什么是#T?你还没有定义,所以你的答案不完整。【参考方案10】:

这是可移植的——至少在 ORACLE 和 PostgreSQL 之间:

select t.* from table t 
where not exists(select 1 from table ti where ti.attr > t.attr);

【讨论】:

这应该如何回答这个问题? 查询选择同一张表中没有其他记录且属性值较大的记录。如果多行具有相同的最小属性值,则全部返回。``` select t.* from table t where not exists(select 1 from table ti where ti.attr > t.attr); ``` 即使您的答案是正确的,通过使用随机的表名和列名,您也很难看到您的答案和问题之间的关系。

以上是关于SQL查询结果加入排序值的问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以选择具有最小值的不同行

如何在sql的查询结果中加入序号

Ora SQL 查询:无引用加入

按查询的where子句中的字段顺序对sql查询的结果进行排序

如何始终只显示 SQL 查询结果表中相同值的第一个值?

搜索结果后对 SQL 查询进行排序