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)
하나의 특정 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
테이블? 상환 서비스 등을 사용하지 않고
해결책
피벗 테이블과 동적 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에서 테스트되었습니다
다른 팁
피벗 테이블을 원하는 것 같습니다. 통화로 다양한 행이있는 경우에는 어렵지만 동적으로 작성된 SQL을 사용하여 여전히 수행 할 수 있습니다.
다음은 Pivot 테이블 사용 방법을 설명하는 MSDN의 리소스입니다. 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
제휴하지 않습니다 StackOverflow