对分组报告进行排序
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 报告中的“分组依据”与 SQLGROUP 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
【讨论】:
以上是关于对分组报告进行排序的主要内容,如果未能解决你的问题,请参考以下文章