2
我有一个历史记录表。一个字段[添加]具有日期时间数据类型。我想要做的是选择一个用户最近的记录,然后将它们从[added]字段派生出来的字符串进行分组。说它的值是2011-05-24 03:32:57.353
,字符串是'Tuesday, May 24, 2011'
。我想按该字符串对记录进行分组,但是按实际时间排序子节点。我也想要一些自定义的XML输出。SQL Server 2008 FOR XML PATH帮助
<ActivityHistory>
<Actvities foo="Tuesday, May 24, 2011">
<Activity id="10000" bar="zoo" bam="2011-05-24 03:32:57.353" />
<Activity id="10001" bar="zoo" bam="2011-05-24 03:31:57.353" />
<Activity id="10002" bar="zoo" bam="2011-05-24 03:28:57.353" />
<Activity id="10003" bar="zoo" bam="2011-05-24 03:21:57.353" />
</Activities>
<Actvities foo="Monday, May 23, 2011">
<Activity id="9990" bar="zoo" bam="2011-05-23 03:32:57.353" />
<Activity id="9989" bar="zoo" bam="2011-05-23 03:31:57.353" />
<Activity id="9988" bar="zoo" bam="2011-05-23 03:28:57.353" />
<Activity id="9987" bar="zoo" bam="2011-05-23 03:21:57.353" />
</Activities>
<Actvities foo="Sunday, May 22, 2011">
<Activity id="9900" bar="zoo" bam="2011-05-22 03:32:57.353" />
<Activity id="9899" bar="zoo" bam="2011-05-22 03:31:57.353" />
<Activity id="9898" bar="zoo" bam="2011-05-22 03:28:57.353" />
<Activity id="9897" bar="zoo" bam="2011-05-22 03:21:57.353" />
</Activities>
</ActivityHistory>
该有效载荷总是只有0-20条记录。可能它总是20.
到目前为止我的查询看起来像这样。
SELECT TOP 20
fnHistoryGroupingText(Added) [@foo]
FROM ActivityHistory
WHERE MricId = 1
GROUP BY fnHistoryGroupingText(Added)
FOR XML PATH ('Activities'), ROOT ('ActivityHistory')
它生成类似于我所寻找的XML。
<ActivityHistory>
<Activities foo="Friday, May 20, 2011" />
<Activities foo="Monday, May 23, 2011" />
<Activities foo="Saturday, May 21, 2011" />
<Activities foo="Sunday, May 22, 2011" />
<Activities foo="Tuesday, May 24, 2011" />
</ActivityHistory>
请注意,它不是日期排序和缺乏子节点。我希望他们按逆时间顺序排序。我故意排除查询中的某些字段,因为在查询中,我正在获取最终想要的结构。当我介绍其他领域时,XML就没有了。对文本进行分组是一种varchar,不会很好地转换为日期。我可以以某种方式使用[added]字段,但是当我将它包含在查询中时,它会破坏我的分组。任何人都可以指出我正确的方向来纠正这些问题吗? [A]正确编写查询,并[B]告诉我如何正确输出我正在寻找的XML。
我去发布一个解决方案,看到你几乎是一样的。 ++为你。 – 2011-05-25 03:15:30
杰出!完美的作品。我有一个问题,是resD第二个公用表表达式?我看到resAll开始;用xxx作为(),然后有一个逗号,并定义了resD。那是对的吗?非常感谢这个伟大的解决方案。我确信FOR XML PATH是要走的路。 – Hcabnettek 2011-05-25 04:12:59
@Hababnettek:是的,'resD'是第二个CTE,是的,这是正确的语法来定义多个CTE。 – 2011-05-25 04:40:15