SQLSERVER 动态转列,生成动态视图

SQLSERVER 动态转列,生成动态视图

创建测试数据

create table test_1(col1 varchar(10),col2 varchar(10),col3 varchar(10));

insert into test_1 values('a','b','c');
insert into test_1 values('q','w','z');
insert into test_1 values('o','p','q');

 

创建存储过程

CREATE PROC SP_ACTIVE_SQL
AS
BEGIN
  -- DECLARE THE VARIABLES TO STORE THE VALUES RETURNED BY FETCH.
  DECLARE @V_COL1 VARCHAR(10), @V_COL2 VARCHAR(10),@V_STRING1 VARCHAR(8000),@V_STRING2 VARCHAR(8000),@V_SQL VARCHAR(8000)

  DECLARE CONTACT_CURSOR CURSOR FOR SELECT COL1,COL2 FROM TEST_1
  OPEN CONTACT_CURSOR
  FETCH NEXT FROM CONTACT_CURSOR
  INTO @V_COL1, @V_COL2
  -- CHECK @@FETCH_STATUS TO SEE IF THERE ARE ANY MORE ROWS TO FETCH.
  WHILE @@FETCH_STATUS = 0
  BEGIN
      IF(@V_STRING1 IS NULL) 
          BEGIN 
              SET @V_STRING1 =  '''' + @V_COL2+ ''' AS ' + @V_COL1
          END 
      ELSE 
          BEGIN 
              SET @V_STRING1 = @V_STRING1 + ','''+ @V_COL2+''' AS '+@V_COL1
          END 

      IF(@V_STRING2 IS NULL) 
          BEGIN 
              SET @V_STRING2 =  'CASE WHEN COL2=' + @V_COL1 +' THEN COL3 ELSE NULL END AS '+ @V_COL1
          END 
      ELSE 
          BEGIN 
              SET @V_STRING2 = @V_STRING2 +', CASE WHEN COL2=' + @V_COL1 +' THEN COL3 ELSE NULL END AS '+ @V_COL1
          END       

     -- THIS IS EXECUTED AS LONG AS THE PREVIOUS FETCH SUCCEEDS.
    FETCH NEXT FROM CONTACT_CURSOR
    INTO @V_COL1, @V_COL2
  END
  CLOSE CONTACT_CURSOR
  DEALLOCATE CONTACT_CURSOR

  --生成SQL语句
  SET @V_SQL='SELECT T1.*,' + @V_STRING2+ ' FROM (SELECT DISTINCT COL2,COL3 FROM TEST_1) T1,(SELECT ' + @V_STRING1 + ') T'
  --PRINT @V_SQL
  EXEC(@V_SQL) 
END 

存储过程作为表进行查询

exec SP_ACTIVE_SQL

### 回答1: SQL Server的动态转列是一种将行数据以列的形式展示的技术。在传统的表结构中,数据是以行的形式存储的,每一行代表一个记录。而动态转列则是将某一列的值作为新的列头,然后将其对应的值作为新列的值。 SQL Server中可以使用PIVOT函数来实现动态转列。该函数可以将一个包含重复值的列转换为多个独立的列,并将重复值作为行数据填充到对应的新列中。 使用PIVOT函数的语法如下所示: SELECT 列列表 FROM 数据源 PIVOT (聚合函数(待转换的列) FOR 列头 IN (列值1, 列值2, ...)) AS 别名; 其中,列列表是需要查询的列;数据源是要从中查询的表或视图;聚合函数是在转换过程中用于聚合数据的函数,可以是SUM、COUNT、AVG等;列头是转换后的新列头的名称;列值是待转换的列中可能出现的值。 例如,假设有一个表格包含有学生的姓名、科目以及对应的成绩,我们希望将科目转换为动态的列头,以学生姓名作为行数据填充到对应的新列中。可以使用以下SQL语句实现: SELECT * FROM (SELECT 姓名, 科目, 成绩 FROM 学生成绩表) AS 原表 PIVOT (AVG(成绩) FOR 科目 IN (数学, 语文, 英语)) AS 转换后的表; 这样就可以将原表中的科目列动态地转换为了数学、语文、英语三个新的列,并将每个学生的成绩填充到对应的新列中。 总之,SQL Server的动态转列可以让我们更加方便地展示和分析数据,提高了数据处理的灵活性和效率。 ### 回答2: 在SQL Server中,可以使用动态转列的方法将行数据转换为列数据。动态转列是一种常用的数据转换技术,特别适用于需要将具有多个行值的列转换为多个列的情况。 示例中,假设有一个名为Employees的表,其中包含员工的姓名、部门和薪水。初始表结构如下: 姓名 | 部门 | 薪水 张三 | 销售 | 5000 李四 | 财务 | 6000 王五 | 开发 | 7000 现在我们希望将每个部门的薪水作为新的列,得到以下结果: 姓名 | 销售 | 财务 | 开发 张三 | 5000 | NULL | NULL 李四 | NULL | 6000 | NULL 王五 | NULL | NULL | 7000 要实现此目标,可以使用动态转列的方法,步骤如下: 1. 使用动态SQL语句创建一个包含部门名称的临时表,例如: ```sql DECLARE @department TABLE (name VARCHAR(50)) INSERT INTO @department SELECT DISTINCT department FROM Employees ``` 2. 使用动态SQL语句构建一个包含员工姓名和对应部门薪水的动态查询语句,例如: ```sql DECLARE @sql NVARCHAR(MAX) SET @sql = 'SELECT e.name, ' + STUFF((SELECT DISTINCT ', MAX(CASE WHEN e.department = ''' + d.name + ''' THEN e.salary ELSE NULL END) AS ' + d.name FROM @department d FOR XML PATH('')), 1, 2, '') + ' FROM Employees e GROUP BY e.name' 3. 执行动态查询语句,得到转换后的结果,例如: ```sql EXECUTE sp_executesql @sql ``` 通过以上步骤,我们可以将原始的行数据转换为列数据,并得到对应部门的薪水信息。 值得注意的是,动态转列需要谨慎使用,特别是当存在大量数据或者动态列数量很多时,可能会导致性能下降或者查询效果不佳。因此,在实际使用中需要根据具体情况进行评估和优化。 ### 回答3: SQL Server中可以使用Pivot操作来实现动态转列。Pivot操作可以将一列的值转换为多个列,并根据某一列的值进行分类。 具体步骤如下: 1. 首先,根据需要的列名和查询的结果,使用动态SQL生成Pivot查询语句。 2. 使用EXECUTE语句执行动态SQL,并将结果存储在一个临时表中。 3. 使用SELECT语句从临时表中查询转置后的结果。 以下是一个示例: ```sql DECLARE @cols AS NVARCHAR(MAX) DECLARE @query AS NVARCHAR(MAX) -- 创建动态列名 SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(category) FROM yourTable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') SET @query = 'SELECT * FROM (SELECT id, category, value FROM yourTable) t PIVOT(MAX(value) FOR category IN (' + @cols + ')) p' -- 创建临时表并执行动态SQL SELECT * INTO #tmpTable FROM yourTable EXECUTE(@query) -- 查询转置后的结果 SELECT * FROM #tmpTable -- 清除临时表 DROP TABLE #tmpTable ``` 以上示例中,yourTable是需要转置的原始表,category列是需要转置的列名,id列是用于分类的列,value列是需要转置的值。在示例中,使用了Pivot函数将category列的值转换为多个列名,并将相应的value值填充到对应的列中。 需要注意的是,动态SQL的使用需要谨慎,需要考虑到SQL注入的风险,并且确保生成动态SQL语句是正确和安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值