【问题标题】:Formatting the T-SQL ResultSet格式化 T-SQL 结果集
【发布时间】:2011-08-26 11:40:21
【问题描述】:

全部,

我有以下由 T-Sql 中的 3-4 个查询生成的 ResultSet。结果如下所示:

每月付款
200 年 1 月
200 年 2 月
200 年 3 月
4 月 200 日
6 月 200 日
7 月 200 日
8 月 200 日
200 年 9 月
200 年 10 月
200 年 11 月
200 年 12 月

现在,根据用户定义的值,比如说 4,我需要像这样安排它们。

每月付款
1 月;2 月;3 月;4 月 200 日
5 月;6 月;7 月;8 月 200 日
............. 等等。

如果用户选择了 3,那么,

每月付款
200 年 1 月;2 月;200 年 3 月
4 月;5 月;200 年 6 月
............. 等等。

我该怎么做?有什么建议么? 提前致谢!! :))

【问题讨论】:

  • SQL Server 处理数据 - 这样的格式应该由您的前端应用程序或您的报告编写器处理....
  • 嗨,Derek Kromm,我只接受了那些回答为我提供了一些线索来解决我的问题的问题。我希望您也不希望我投票赞成无用的答案。我正在使用 Sql SERVER 2008。
  • 嗨,marc_s,不要介意,但我不同意这一点。 Sql Server 的兼容性足以处理这些小的格式问题。
  • 付款会一直一样吗?
  • @Raj:数据库通常不应该执行格式化任务 - 你说它是一个“小”格式化任务,但这条线在哪里?为简单起见,您应该在表示层中执行此操作。

标签: tsql


【解决方案1】:

我真的不知道如何处理付款,因为你没有描述它,这是一种用recusive sql解决它的方法

declare @t table([Month] varchar(12), Payment int)
declare @uservalue int
set  @uservalue = 3
insert @t values('January',200)
insert @t values('February', 200)
insert @t values(' March', 200)
insert @t values('April', 200)
insert @t values('May', 200)
insert @t values('June', 200)
insert @t values('July', 200)
insert @t values('August', 200)
insert @t values('September', 200)
insert @t values('October', 200)
insert @t values('November', 200)
insert @t values('December', 200)

;with a as(
select month, payment, rn = row_number() over (order by (select 1))
from @t
), b as
(
select cast(month as varchar(200)) month, payment, rn
from a where (rn - 1) % @uservalue = 0
union all
select cast(b.month +';'+ a.month as varchar(200)), a.payment, a.rn
from b join a on a.rn - 1 = b.rn and b.rn %@uservalue > 0
)
select month, payment from b where rn % @uservalue = 0

【讨论】:

    【解决方案2】:

    这是一个xml解决方案

    declare @t table([Month] varchar(12), Payment int)
    declare @uservalue int
    set  @uservalue = 3
    insert @t values('January',200)
    insert @t values('February', 200)
    insert @t values(' March', 200)
    insert @t values('April', 200)
    insert @t values('May', 200)
    insert @t values('June', 200)
    insert @t values('July', 200)
    insert @t values('August', 200)
    insert @t values('September', 200)
    insert @t values('October', 200)
    insert @t values('November', 200)
    insert @t values('December', 200)
    
    ;WITH x AS ( select payment, rn = (row_number() over(order by (select 1)) - 1)/@uservalue, month
    FROM @t
    ) 
    SELECT REPLACE(STUFF(( 
    SELECT ',' + [month] 
    FROM x t 
    WHERE t.rn = x.rn
    for xml path(''), type 
    ).value('.', 'varchar(max)'), 1, 1, ''), ',', ' ') [month], payment FROM x
    GROUP BY rn, payment
    

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 2019-03-08
      • 2012-03-09
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2022-01-19
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多