0

我正在向您发送我一团糟的详细信息。下面我描述。

原始表结构。

ID 日期 TimeLogged(Hrs) 用户名
1 2012 年 10 月 8 日 5.50 布拜
2 2012 年 11 月 8 日 2.30 布拜
3 2012 年 10 月 8 日 3.30 巴努
4 2012 年 11 月 8 日 7.30 巴努

我想要如下结果。用户名应该是动态的。可能是很多用户。用户名将来自数据库表。我想在 Gridview(Front End) 中显示详细信息。请广泛解释,因为我是开发新手。

日期 Bubai Bhanu 总计
2012 年 10 月 8 日 5.30 3 8. 30
2012 年 11 月 8 日 2.30 7.30 10
  总计 8 10.30 18.30
4

2 回答 2

1

您可以PIVOT为此使用 a,静态或动态。您可以将此代码放在存储过程中并用它填充您的数据网格。

Static Pivot(参见SQL Fiddle with Demo)这意味着您将对所有值进行硬编码:

select convert(char(10), dt, 101), [Bubai], [Bhanu], ([Bubai] + [Bhanu]) total
from
(
    select dt, timelogged, username
    from test
)x
pivot
(
    sum(timelogged)
    for username in ([Bubai], [Bhanu])
)p
union all
select 'total', sum([Bubai]), sum([Bhanu]), sum([Bubai] +[Bhanu])
from
(
    select dt, timelogged, username
    from test
)x
pivot
(
    sum(timelogged)
    for username in ([Bubai], [Bhanu])
)p

Dynamic Pivot(参见SQL Fiddle with Demo),这将获得在运行时转换的字段列表:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @totalCol AS NVARCHAR(MAX),
    @totalRow AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.username) 
            FROM test c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @totalCol = STUFF((SELECT distinct '+' + QUOTENAME(c.username) 
            FROM test c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @totalRow = STUFF((SELECT distinct ',Sum(' + QUOTENAME(c.username) + ')'
            FROM test c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



set @query = 'SELECT convert(char(10), dt, 101), ' + @cols + ', '+@totalCol +' total from 
            (
                select dt, timelogged, username
                from test
           ) x
            pivot 
            (
                sum(timelogged)
                for username in  (' + @cols + ')
            ) p 
            union all
            select ''total'', '+ @totalRow +', sum('+@totalCol+')
            from
            (
                select dt, timelogged, username
                from test
            )x
            pivot
            (
                sum(timelogged)
                for username in (' + @cols + ')
            )p'


execute(@query)

这两者都会产生相同的结果。

于 2012-08-17T14:38:13.843 回答
0

@NikolaMarkovinović 是对的,您应该使用透视查询获得所需的结果,问题是您必须知道要透视的列中的值

SELECT Date , [Bunbai] , [Bhanu] , ..., /* This names have to be known, the same as in the IN part of the PIVOT */
/* You can even do this */
[Bunbai]+[Bhanu] AS Total
FROM ( <SELECT query that produces the data> ) AS T
PIVOT ( SUM( TimeLoggedHours ) FOR UserName
IN ( [Bunbai] , [Bhanu] , ... ) 
/* You can't write some subquery inside the IN, columns names have to be known */
) AS pvt

,您将需要在您的代码中编写一个动态查询方法,首先获取列的名称,然后将它们添加到查询的标题和 PIVOT 的 IN 部分。

要在底部添加总计,只需编写相同的查询,但在生成数据的查询中,而不是日期选择“总计”并使用 UNION ALL

希望这可以帮助。

于 2012-08-17T14:16:51.200 回答