我正在尝试在我订购之后对查询进行分组,但是,在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
答案 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
这是我在进行订购后'分组的版本,虽然我没有按照这些条款考虑它 - 我认为它是'自定义'排序。