私はこのようなタイムクロック情報を含むSQLテーブルを持っています。特定の日付に従業員が働いていた分数。テーブルは数年間の価値がありますが、土曜日と日曜日、および休日以外の日/休日が不足しています(時折の例外を含む)。1か月に日付を列としてピボットします。動的SQLなしで可能ですか?
EmployeeID Date Attended Total Minutes
-----------------------------------
001 '11/01/2011' 319
002 '11/01/2011' 355
003 '11/01/2011' 352
001 '11/02/2011' 340
002 '11/02/2011' 322
003 '11/02/2011' 351
このようなデータを、指定された月の出席を要約したレポートに表示するピボットを作成する必要があります。
EmployeeId '11/01/2011' '11/02/2011' .... (for all dates in a month)
-----------------------------------------------------------------------
001 319 340
002 355 322
003 352 351
私は機能するソリューションを持っている(下記参照)... が、私のアプローチは、特定の月の日からピボットステートメントを構築するために動的SQLを使用しています。私の心の後ろには、動的SQLを使用しない方法がなければならないと思っていますが、それは私には当てはまりません。任意の提案... 私は動的SQLに立ち往生ですか?
DECLARE @columns VARCHAR(8000)
DECLARE @headers VARCHAR(8000)
DECLARE @lowdate Date
DECLARE @highdate Date
SELECT @columns = COALESCE(@columns + ',[' + cast(Attended as varchar) + ']',
'[' + cast(Attended as varchar)+ ']')
FROM TimeAttended WHERE attended >= @date and attended <= @highdate
GROUP BY Attended
SELECT @headers = COALESCE(@Headers + ',Sum([' + cast(Attended as varchar) + ']) as [' + cast(Attended as varchar) + ']',
'Sum([' + cast(Attended as varchar)+ ']) as [' + cast(Attended as varchar) + ']')
FROM TimeAttended WHERE attended >= @date and attended <= @highdate
GROUP BY Attended
DECLARE @query VARCHAR(8000)
SET @query = '
SELECT employeeid, ' + @headers + '
FROM TimeAttended
PIVOT
(
Sum(TotalMinutes)
FOR [Attended]
IN (' + @columns + ')
)
AS p group by employeeid'
EXECUTE(@query)
これは興味深いオプションです...私はそれにいくつかの脳の力を投げ、あなたに戻ってくるつもりです。 – RThomas
これは機能します...私は受け入れる前に私が既にそれをやっている方法と比較して、それがどう動くかを見るためにいくつかのテストを行いますが、+動的なSQLを使用しない創造的なアプローチを私に与える+1。 – RThomas
複数の結合アプローチが勝ちます。レポートサービスのレポートを作成し始めた後、動的な方法でレポートの列をマッピングできなくなったことがわかりました。代わりに1 - 31という名前を付けることで、自分のrdlc内の関数を使用して、自分の日付に基づいて実際の日付を追加する列に名前を付けることができます。再度、感謝します。 – RThomas