【问题标题】:How to get table-like query result on SQL Server 2005/8?如何在 SQL Server 2005/8 上获得类似表的查询结果?
【发布时间】:2010-11-07 09:41:01
【问题描述】:

我有 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

其中ownerID 中的accounts.ownercurrency1,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 表中的每个对象获得相同的结果?不使用报告服务等。

【问题讨论】:

  • 组合 (user_id,currency_id) 在帐户中是否唯一?

标签: sql sql-server sql-server-2008 tsql pivot


【解决方案1】:

使用数据透视表和动态 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 中测试的

【讨论】:

  • 谢谢!没有这么复杂的 dyn SQL 就没有办法只用 PIVOT 吗?
  • 如果您需要动态列(添加或删除新货币或更改货币名称),您仍然需要动态 SQL。
【解决方案2】:

听起来你想要一个数据透视表。如果您有不同数量的货币行,这将很难做到,但仍然可以通过使用动态编写的 sql 来完成。

下面是 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

【讨论】:

  • 感谢您的回答!我将阅读有关数据透视表的更多信息。关于你的例子 - 我在哪里添加'FROM currency AS C' - 据我所知
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
相关资源
最近更新 更多