订购后如何对查询进行分组?

时间:2011-03-07 21:52:37

标签: mysql sql db2

我正在尝试在我订购之后对查询进行分组,但是,在sql(我正在使用DB2)中,我们无法在执行订单后进行分组,但是如果我在对分组更改进行分组后进行排序。这样做的原因是因为它基于多个属性而不仅仅是1分组(我只需要按1属性分组,但由于我们需要匹配select语句,我必须按多个属性进行分组。

我尝试使用“with”做一个虚拟表,并尝试在其中进行排序,但DB2说我只能分组而不是在with属性中订购

在声明中也是如此。我尝试在from属性中执行嵌套查询,该查询返回有序结果,但DB2限制我们在from属性内部进行排序(仅允许分组)

所以我不知道该如何做到这一点,如何在订购后分组?

以下是一个示例表:

口袋妖怪:

id name age
3皮卡丘1
2 bulbasure 3
1 charazard 2
11皮卡丘10

(在口袋妖怪表中)
主键id,名称
外键(名称)引用pokedex(名称))

pokedex:

身份状态
皮卡丘derp
charazard herp
灯泡打嗝

现在我要做的是列出口袋妖怪表: 按年龄排序,姓名
但之后我希望结果按其ID分组,但是我选择了他们的ID,姓名,年龄和状态,所以在分组时我必须匹配这些属性:
GROUP BY pokedex.id年龄状况.....
所以问题是如果我在分组之后订购它打破了pokedex.id的分组,因为它按状态和其他属性分组
举个例子,并没有真正构建与口袋妖怪相关的任何东西:P

1 个答案:

答案 0 :(得分:1)

如果您想要ORDER BY您不想要GROUP BY的变量,我可以看到这可能是一个问题。不包括GROUP BY语句中的某些变量会从结果表中删除那些列,因此您将无法按它们排序。

在您的示例中,您可能希望显示给定的Pokemon具有特定状态的次数,如下所示:

SELECT
   p.name
   ,d.status
   ,count(*) tally
FROM pokemon p
   INNER JOIN pokedex d on p.name=d.id
GROUP BY
   p.name
   ,d.status

您无法按'年龄'排序上述查询结果,因为您没有GROUP BY名称,状态,年龄。

在这个例子中,我会这样做:

SELECT
   p.age
   ,p.name
   ,d.status
   ,count(*) tally
FROM pokemon p
   INNER JOIN pokedex d on p.name=d.id
GROUP BY
   p.age
   ,p.name
   ,d.status

然而,并且在您的观点中,并不总是可以在“分组依据”子句中包含您希望按以下顺序排列数据的列。因此,以您的Pokemon数据/表格为例,让我举例说明可能有用的一般方法:

1)首先,我会创建一个包含自定义排序的表:

SELECT
   *
   ,ROW_NUMBER() as my_order
FROM (
   SELECT
      age
      ,name
   FROM pokemon
   ORDER BY
      age
      ,name
)

2)然后,我将其加入到我的分组表的其余部分,按照我为此目的创建的自定义“my_order”列进行排序:

SELECT
   a.*
   ,custom.my_order
FROM a   -- I'm calling 'a' your table, after your joins/group bys
  INNER JOIN (
    SELECT
       name
       ,ROW_NUMBER() as my_order
    FROM (
        SELECT
           age
           ,name
        FROM pokemon
        ORDER BY
           age
           ,name
    ) 
) AS custom ON a.name=custom.name
ORDER BY custom.my_order

这是我在进行订购后'分组的版本,虽然我没有按照这些条款考虑它 - 我认为它是'自定义'排序。