0

私が混乱している詳細をお送りします。以下に説明します。

元のテーブル構造。

ID 日付 TimeLogged(Hrs) UserName
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 Banu 合計
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これには、静的または動的のいずれかを使用できます。このコードをストアド プロシージャに配置して、データグリッドに入力することができます。

静的ピボット( 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 に答える