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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top