【问题标题】:Convert sqlserver data to Pivot table [closed]将sql server数据转换为数据透视表[关闭]
【发布时间】:2012-12-05 18:47:59
【问题描述】:
ID ---- ACCOUNT ---- SECTOR ---- AMOUNT_CURRENCY1 ------ AMOUNT_CURRENCY2
1  --- account1 ---- sector1 --- 100              ------ 200
2  --- account1 ---- sector2 --- 150              ------ 250
3  --- account2 ---- sector1 --- 250              ------ 300
4  --- account2 ---- sector2 --- 90               ------ 180

我需要这样的数据

               sector1 ------------ sector2
         | amount1 | amount2 |  amount1 | amount2
Account1 | 100     | 200
Account2 | 250     | 250

我需要把结果放到asp.net gridview中编辑

我正在使用以下脚本: 1-获取列:

DECLARE @ColumnHeaders VARCHAR(MAX)
SELECT @ColumnHeaders =
  COALESCE(

  @ColumnHeaders + ',[!sector:' + cast(sector_ID as nvarchar)+ ':' + sector_name + ']',
    '[!sector:' + cast(sector_ID as nvarchar)+ ':' + sector_name+ ']'
  )
FROM vw_Transaction
group by sector_ID, sector_name

2- 枢轴:

DECLARE @TableSQL NVARCHAR(MAX)
SET @TableSQL = N'
  SELECT *
  FROM (SELECT trans_id, account_name, sector_id, sector_name,
  amount_currency1, amount_currency2, ''!sector:'' + cast(sector_ID as nvarchar)+ '':'' + sector_name as col
FROM         dbo.vw_Transaction 
WHERE 
trans_id=' + CAST(@trans_id as varchar) +'
  ) AS PivotData
  PIVOT (
    MAX(amount_currency1)
    FOR col IN (
      ' + @ColumnHeaders + '
    )
  ) AS PivotTable' 
EXECUTE(@TableSQL)

问题,我有 2 个需要旋转的字段,amount_currency1 和amount_currency2

【问题讨论】:

  • 在 0.03 秒内关闭
  • 给我们看一些代码,到目前为止你尝试了什么?
  • @АртёмЦарионов 给新用户一些时间来改进和学习,帮助他如何改进它。

标签: asp.net gridview sql-server-2008-r2 pivot unpivot


【解决方案1】:

由于您尝试在两个值上使用 PIVOT,因此您必须首先 UNPIVOT AMOUNT_CURRENCY1AMOUNT_CURRENCY2 列:

您需要在查询中添加类似这样的内容:

select account, value, sector+ '_'+col as col
from
(
select sector,
  account,
  AMOUNT_CURRENCY1,
  AMOUNT_CURRENCY2
from vw_Transaction
) src
unpivot
(
value
for col in (AMOUNT_CURRENCY1, AMOUNT_CURRENCY2)
) unpiv

那么你的最终查询会是这样的:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT DISTINCT ',' 
                      + quotename(t.sec+'_'+c.name)
                    from
                    (
                      select sector sec
                      from vw_Transaction
                    ) t
                    cross apply sys.columns as C
                   where C.object_id = object_id('vw_Transaction') and
                         C.name not in ('id', 'account', 'sector')
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT account,' + @cols + ' from 
             (
               select account, value,
                  sector+ ''_''+col as col
              from
              (
                select sector,
                  account,
                  AMOUNT_CURRENCY1,
                  AMOUNT_CURRENCY2
                from vw_Transaction
              ) src
              unpivot
              (
                value
                for col in (AMOUNT_CURRENCY1, AMOUNT_CURRENCY2)
              ) unpiv
            ) x
            pivot
            (
              max(value)
              for col in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demo

结果:

|  ACCOUNT | SECTOR1_AMOUNT_CURRENCY1 | SECTOR1_AMOUNT_CURRENCY2 | SECTOR2_AMOUNT_CURRENCY1 | SECTOR2_AMOUNT_CURRENCY2 |
------------------------------------------------------------------------------------------------------------------------
| account1 |                      100 |                      200 |                      150 |                      250 |
| account2 |                      250 |                      300 |                       90 |                      180 |

【讨论】:

  • 这很好用,我有一个问题,无论如何要添加 ID,因为我需要它来进行更新操作?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
相关资源
最近更新 更多