SQL Serverの2005/8上の表のようなクエリの結果を取得する方法は?
-
21-08-2019 - |
質問
私は3つのテーブルがあります:
users (id, name)
currency (id, name)
accounts (id, user_id, currency_id, amount)
そして私はaccounts
からデータを読み込み、テーブルのようなビューでそれを提示したい。
owner currency1 currency2 currency3
1 0 0 0
2 10 20 30
3 0 5 10
owner
はID
のaccounts.owner
である場合、currency1,2,3
- (SELECT id FROM currency WHERE name = '1',etc)
私は1つの特定のIDのために、このような結果を得ることができます:
SELECT
SELECT amount FROM accounts WHERE currency = (SELECT id FROM currency WHERE name = 'currency1') AND owner = @user) AS [currency1],
SELECT amount FROM accounts WHERE currency = (SELECT id FROM currency WHERE name = 'currency2') AND owner = @user) AS [currency2],
SELECT amount FROM accounts WHERE currency = (SELECT id FROM currency WHERE name = 'currency2') AND owner = @user) AS [currency2]
これはusers
テーブル内のすべてのオブジェクトに対して同じ結果を得ることは可能ですか? Reporingサービス、などを使用せずます。
解決
の列を取得するために、ピボットテーブルと動的SQLを使用してください。
DECLARE @columns VARCHAR(2000)
SELECT @columns = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + c.name
FROM currency AS c
ORDER BY '],[' + c.name
FOR XML PATH('')
), 1, 2, '') + ']'
DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT UserName, ' + @columns +
'FROM
(SELECT u.Name AS UserName, c.name AS CurrencyName, a.Amount
FROM Accounts AS a WITH(NOLOCK)
JOIN Users u WITH(NOLOCK) ON a.user_id = u.user_id
JOIN Currency c WITH(NOLOCK) ON a.currency_id = c.currency_id
) p
PIVOT
(
SUM (p.Amount)
FOR p.CurrencyName IN
( '+ @columns +')
) AS pvt
ORDER BY UserName'
EXECUTE(@query)
このは、SQL Server 2005でテストされました。
他のヒント
あなたはピボットテーブルをしたいのように
サウンド。あなたが通貨での行の様々な数を持っている場合は行うことが困難になりますが、それでもdynamiclly書かれたSQLを使用して行うことができます。
のhttp:ここで、ピボットテーブルを使用する方法について説明しますMSDNからのリソースです://msdn.microsoft.com/en-us/library/ms177410.aspxする
SELECT u.name, [1] AS Currency1, [2] AS Currency2, [3] AS Currency3
FROM
(SELECT u.Name AS UserName, c.Currency_ID, a.Amount
FROM Accounts AS a WITH(NOLOCK)
JOIN Users u WITH(NOLOCK) ON a.user_id = u.user_id
) p
PIVOT
(
SUM (p.Amount)
FOR p.Currency_id IN
( [1], [2], [3] )
) AS pvt
ORDER BY pvt.UserName
所属していません StackOverflow