Come arrivare tavolo-come risultato di una query in SQL Server 2005/8?
-
21-08-2019 - |
Domanda
Ho 3 tabelle:
users (id, name)
currency (id, name)
accounts (id, user_id, currency_id, amount)
E voglio leggere i dati dal accounts
e presentarli in vista tabella simile:
owner currency1 currency2 currency3
1 0 0 0
2 10 20 30
3 0 5 10
Dove owner
è ID
di accounts.owner
, currency1,2,3
- (SELECT id FROM currency WHERE name = '1',etc)
posso ottenere tale risultato solo per un ID specifico:
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]
E 'possibile ottenere lo stesso risultato per ogni oggetto in users
tavola? Senza utilizzando il servizio di Reporing, ecc.
Soluzione
Utilizzare una tabella pivot e SQL dinamico per recuperare le colonne
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)
Questo è stato testato in SQL Server 2005
Altri suggerimenti
Sembra che si desidera una tabella pivot. Sarà difficile da fare se si dispone di un numero variabile di righe in valuta, ma potrebbe ancora essere fatto utilizzando SQL dynamiclly scritta.
Ecco una risorsa da MSDN che spiega come utilizzare la tabella pivot: http : //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