对分组报告进行排序

Posted

技术标签:

【中文标题】对分组报告进行排序【英文标题】:Sorting a grouped report 【发布时间】:2013-06-18 14:16:39 【问题描述】:

我的架构看起来有点像这样:

SEQ  GROUP1  GROUP2  GROUP3  VALUE

SEQ 大致相当于行号——它实际上是来自外部表的排序顺序——而GROUPx 字段进一步描述了数据。所以,例如:

SEQ  GROUP1  GROUP2  GROUP3  VALUE
---- ------- ------- ------- ------
1    A       A       A       123
2    A       A       A       456
3    A       B       C       foo
5    X       Y       Z       bar
4    A       B       D       baz

我希望这些数据按此层次结构分组,但按SEQ 排序。因此,上述数据会生成如下报告:

A
  A
    A
      123
      456
  B
    C
      foo
    D
      baz
X
  Y
    Z
      bar

我一直在玩报告的“分组和排序”选项,我似乎可以让它排序但不分组,或分组但不排序!

例如,如果我指定:

GROUP1分组 按GROUP2分组 按GROUP3分组 通过SEQ订购

分组级别字段中的值决定了数据的输出顺序。 (在这种情况下,我选择的名称无论如何都是按字母顺序排列的,但是如果我将GROUP1 中的X 的名称更改为123,它将出现在报告的顶部。)

如果我把“Order by SEQ”移到最高优先级,顺序是正确的,但是分组级别被破坏:Access 基本上将SEQ 字段视为分组级别,然后重复后续层次结构对于该组中的每个值。

有没有什么方法可以实现我正在寻找的东西,而无需为每个 GROUPx 字段(而不是我当前的“全局”SEQ)设置一个 SEQx 字段?

【问题讨论】:

【参考方案1】:

我认为您将不得不对此进行左连接。首先,只使用 SEQ 创建一个查询,并按 SEQ 排序。然后将您的分组查询和左连接到您的第一个查询,以便它保持正确的顺序。有道理?

您的查询代码或多或少应该是:

SELECT 
First(B.SEQ) AS FirstOfSEQ, tblTest.Group1, tblTest.Group2, tblTest.Group3, tblTest.Val AS Val2 FROM (SELECT tblTest.SEQ FROM tblTest ORDER BY tblTest.SEQ) AS B 
LEFT JOIN tblTest ON B.SEQ = tblTest.SEQ 
GROUP BY tblTest.Group1, tblTest.Group2, tblTest.Group3, tblTest.Val 
ORDER BY First(B.SEQ); 

在报表布局中,按 SEQ 排序,然后按其他值分组,您应该会得到所需的内容。

【讨论】:

n.b.,Access 报告中的“分组依据”与 SQL GROUP BY 子句不同。对微软来说,这是一个糟糕的选择。也许“Arrange by”或“Head by”会更好...... ...我的意思是您的解决方案不相关。但是,非常感谢,所以谢谢你:) 这绝对对我有用:SELECT First(B.SEQ) AS FirstOfSEQ, tblTest.Group1, tblTest.Group2, tblTest.Group3, tblTest.Val AS Val2 FROM (SELECT tblTest.SEQ FROM tblTest ORDER BY tblTest.SEQ) AS B LEFT JOIN tblTest ON B.SEQ = tblTest.SEQ GROUP BY tblTest.Group1, tblTest.Group2, tblTest.Group3, tblTest.Val ORDER BY First(B.SEQ);在报表布局中,按 SEQ 排序,然后按其他值分组,您应该会得到所需的结果。 在这种情况下,您可能希望使用此代码编辑您的原始答案,因为您的建议并不明显......我会用我的数据和回复你。 糟糕!很抱歉混淆了。我编辑了原始答案,希望对您有所帮助!【参考方案2】:

我自己解决了这个问题

选择 TimeOffRequestID,您的姓名为“员工姓名”,替换(forwardcallsto,'Select One','Voicemail')为“转接电话”,约会为“评论”来自 dbo.nei_TimeOffRequest WHERE CAST(CONVERT(VARCHAR,GETDATE(),101) AS DATETIME) 在开始和结束之间 按你的名字订购 ASC

【讨论】:

以上是关于对分组报告进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何对DevExpress ASPxGridView进行分组排序

s-s-rS 2008 排序不工作

mongo对分组数据进行排序

三、MySQL数据库之分组排序

SQL如何对分组后的结果进行排序并且取前几名

如何在AngularJS ui-grid中对分组行进行排序?