时间:2021-07-01 10:21:17 帮助过:15人阅读
- <span style="color: #008080">--</span><span style="color: #008080">2 先以静态的方式实现行转列,效果如图3所示:</span><span style="color: #008080">
- --</span><span style="color: #008080">静态sql行转列</span>
- <span style="color: #0000ff">SELECT</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">UserName</span><span style="color: #ff0000">]</span><span style="color: #000000">,
- </span><span style="color: #ff00ff">SUM</span>(<span style="color: #ff00ff">CASE</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span> <span style="color: #0000ff">WHEN</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">数学</span><span style="color: #ff0000">‘</span> <span style="color: #0000ff">THEN</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Source</span><span style="color: #ff0000">]</span> <span style="color: #0000ff">ELSE</span> <span style="color: #800000; font-weight: bold">0</span> <span style="color: #0000ff">END</span>) <span style="color: #0000ff">AS</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">[数学]</span><span style="color: #ff0000">‘</span><span style="color: #000000">,
- </span><span style="color: #ff00ff">SUM</span>(<span style="color: #ff00ff">CASE</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span> <span style="color: #0000ff">WHEN</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">英语</span><span style="color: #ff0000">‘</span> <span style="color: #0000ff">THEN</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Source</span><span style="color: #ff0000">]</span> <span style="color: #0000ff">ELSE</span> <span style="color: #800000; font-weight: bold">0</span> <span style="color: #0000ff">END</span>) <span style="color: #0000ff">AS</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">[英语]</span><span style="color: #ff0000">‘</span><span style="color: #000000">,
- </span><span style="color: #ff00ff">SUM</span>(<span style="color: #ff00ff">CASE</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span> <span style="color: #0000ff">WHEN</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">语文</span><span style="color: #ff0000">‘</span> <span style="color: #0000ff">THEN</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Source</span><span style="color: #ff0000">]</span> <span style="color: #0000ff">ELSE</span> <span style="color: #800000; font-weight: bold">0</span> <span style="color: #0000ff">END</span>) <span style="color: #0000ff">AS</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">[语文]</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">FROM</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">TestRows2Columns</span><span style="color: #ff0000">]</span>
- <span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">UserName</span><span style="color: #ff0000">]</span>
- <span style="color: #0000ff">GO</span>
- <span style="color: #008080">--</span><span style="color: #008080">3 接着以动态的方式实现行转列,这是使用拼接SQL的方式实现的,所以它适用于SQL Server 2000以上的数据库版本,执行脚本返回的结果如图2所示;</span><span style="color: #008080">
- --</span><span style="color: #008080">动态拼接行转列</span>
- <span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@sql</span> <span style="color: #0000ff">VARCHAR</span>(<span style="color: #800000; font-weight: bold">8000</span><span style="color: #000000">)
- </span><span style="color: #0000ff">SET</span> <span style="color: #008000">@sql</span> <span style="color: #808080">=</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">SELECT [UserName],</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">SELECT</span> <span style="color: #008000">@sql</span> <span style="color: #808080">=</span> <span style="color: #008000">@sql</span> <span style="color: #808080">+</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">SUM(CASE [Subject] WHEN </span><span style="color: #ff0000">‘‘‘</span><span style="color: #808080">+</span><span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span><span style="color: #808080">+</span><span style="color: #ff0000">‘‘‘</span><span style="color: #ff0000"> THEN [Source] ELSE 0 END) AS </span><span style="color: #ff0000">‘‘‘</span><span style="color: #808080">+</span><span style="color: #ff00ff">QUOTENAME</span>(<span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span>)<span style="color: #808080">+</span><span style="color: #ff0000">‘‘‘</span><span style="color: #ff0000">,</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">FROM</span> (<span style="color: #0000ff">SELECT</span> <span style="color: #0000ff">DISTINCT</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span> <span style="color: #0000ff">FROM</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">TestRows2Columns</span><span style="color: #ff0000">]</span>) <span style="color: #0000ff">AS</span><span style="color: #000000"> a
- </span><span style="color: #0000ff">SELECT</span> <span style="color: #008000">@sql</span> <span style="color: #808080">=</span> <span style="color: #808080">LEFT</span>(<span style="color: #008000">@sql</span>,<span style="color: #ff00ff">LEN</span>(<span style="color: #008000">@sql</span>)<span style="color: #808080">-</span><span style="color: #800000; font-weight: bold">1</span>) <span style="color: #808080">+</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000"> FROM [TestRows2Columns] GROUP BY [UserName]</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">PRINT</span>(<span style="color: #008000">@sql</span><span style="color: #000000">)
- </span><span style="color: #0000ff">EXEC</span>(<span style="color: #008000">@sql</span><span style="color: #000000">)
- <img alt="技术分享" src="https://img.gxlcms.com//Uploads-s/new/2020-10-13-qlqqti/20180110222922176285.png"></span>
- <span style="color: #008080">--</span><span style="color: #008080">4 在SQL Server 2005之后有了一个专门的PIVOT 和 UNPIVOT 关系运算符做行列之间的转换,下面是静态的方式实现的,实现效果如图4所示:</span>
- <span style="color: #008080">--</span><span style="color: #008080">静态PIVOT行转列</span>
- <span style="color: #0000ff">SELECT</span> <span style="color: #808080">*</span>
- <span style="color: #0000ff">FROM</span><span style="color: #000000"> (
- </span><span style="color: #0000ff">SELECT</span>
- <span style="color: #ff0000">[</span><span style="color: #ff0000">UserName</span><span style="color: #ff0000">]</span><span style="color: #000000">,
- </span><span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span><span style="color: #000000">,
- </span><span style="color: #ff0000">[</span><span style="color: #ff0000">Source</span><span style="color: #ff0000">]</span>
- <span style="color: #0000ff">FROM</span><span style="color: #000000"> TestRows2Columns
- ) p
- PIVOT (</span><span style="color: #ff00ff">SUM</span>(<span style="color: #ff0000">[</span><span style="color: #ff0000">Source</span><span style="color: #ff0000">]</span>) <span style="color: #0000ff">FOR</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span> <span style="color: #808080">IN</span> (<span style="color: #ff0000">[</span><span style="color: #ff0000">数学</span><span style="color: #ff0000">]</span>,<span style="color: #ff0000">[</span><span style="color: #ff0000">英语</span><span style="color: #ff0000">]</span>,<span style="color: #ff0000">[</span><span style="color: #ff0000">语文</span><span style="color: #ff0000">]</span>)) <span style="color: #0000ff">AS</span><span style="color: #000000"> pvt
- </span><span style="color: #0000ff">ORDER</span> <span style="color: #0000ff">BY</span> pvt.<span style="color: #ff0000">[</span><span style="color: #ff0000">UserName</span><span style="color: #ff0000">]</span><span style="color: #000000">;
- </span><span style="color: #0000ff">GO</span>
- <span style="color: #008080">--</span><span style="color: #008080">5 把上面静态的SQL基础上进行修改,这样就不用理会记录里面存储了什么,需要转成什么列名的问题了,脚本如下,效果如图4所示:</span><span style="color: #008080">
- --</span><span style="color: #008080">动态PIVOT行转列</span>
- <span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@sql_str</span> <span style="color: #0000ff">VARCHAR</span>(<span style="color: #800000; font-weight: bold">8000</span><span style="color: #000000">)
- </span><span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@sql_col</span> <span style="color: #0000ff">VARCHAR</span>(<span style="color: #800000; font-weight: bold">8000</span><span style="color: #000000">)
- </span><span style="color: #0000ff">SELECT</span> <span style="color: #008000">@sql_col</span> <span style="color: #808080">=</span> <span style="color: #ff00ff">ISNULL</span>(<span style="color: #008000">@sql_col</span> <span style="color: #808080">+</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">,</span><span style="color: #ff0000">‘</span>,<span style="color: #ff0000">‘‘</span>) <span style="color: #808080">+</span> <span style="color: #ff00ff">QUOTENAME</span>(<span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span>) <span style="color: #0000ff">FROM</span> TestRows2Columns <span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> <span style="color: #ff0000">[</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">]</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@sql_str</span> <span style="color: #808080">=</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">
- SELECT * FROM (
- SELECT [UserName],[Subject],[Source] FROM [TestRows2Columns]) p PIVOT
- (SUM([Source]) FOR [Subject] IN ( </span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span> <span style="color: #008000">@sql_col</span> <span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">) ) AS pvt
- ORDER BY pvt.[UserName]</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">PRINT</span> (<span style="color: #008000">@sql_str</span><span style="color: #000000">)
- </span><span style="color: #0000ff">EXEC</span> (<span style="color: #008000">@sql_str</span><span style="color: #000000">)
- <img alt="技术分享" src="https://img.gxlcms.com//Uploads-s/new/2020-10-13-qlqqti/20180110222922204606.png"></span>
- <span style="color: #008080">--</span><span style="color: #008080">6 需要不断的修改成他自己环境中表名、分组列、行转列字段、字段值这几个参数,逻辑如图5所示,所以,我继续对上面的脚本进行修改,你只要设置自己的参数就可以实现行转列了,效果如图4所示:</span><span style="color: #008080">
- --</span><span style="color: #008080">带条件查询的参数化动态PIVOT行转列</span><span style="color: #008080">
- --</span><span style="color: #008080"> =============================================</span>
- <span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@sql_str</span> <span style="color: #0000ff">NVARCHAR</span>(<span style="color: #ff00ff">MAX</span><span style="color: #000000">)
- </span><span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@sql_col</span> <span style="color: #0000ff">NVARCHAR</span>(<span style="color: #ff00ff">MAX</span><span style="color: #000000">)
- </span><span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@sql_where</span> <span style="color: #0000ff">NVARCHAR</span>(<span style="color: #ff00ff">MAX</span><span style="color: #000000">)
- </span><span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@tableName</span> SYSNAME <span style="color: #008080">--</span><span style="color: #008080">行转列表</span>
- <span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@groupColumn</span> SYSNAME <span style="color: #008080">--</span><span style="color: #008080">分组字段</span>
- <span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@row2column</span> SYSNAME <span style="color: #008080">--</span><span style="color: #008080">行变列的字段</span>
- <span style="color: #0000ff">DECLARE</span> <span style="color: #008000">@row2columnValue</span> SYSNAME <span style="color: #008080">--</span><span style="color: #008080">行变列值的字段</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@tableName</span> <span style="color: #808080">=</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">TestRows2Columns</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@groupColumn</span> <span style="color: #808080">=</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">UserName</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@row2column</span> <span style="color: #808080">=</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">Subject</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@row2columnValue</span> <span style="color: #808080">=</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">Source</span><span style="color: #ff0000">‘</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@sql_where</span> <span style="color: #808080">=</span> <span style="color: #ff0000">‘</span><span style="color: #ff0000">WHERE UserName = </span><span style="color: #ff0000">‘‘</span><span style="color: #ff0000">王五</span><span style="color: #ff0000">‘‘‘</span>
- <span style="color: #008080">--</span><span style="color: #008080">从行数据中获取可能存在的列</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@sql_str</span> <span style="color: #808080">=</span> N<span style="color: #ff0000">‘</span><span style="color: #ff0000">
- SELECT @sql_col_out = ISNULL(@sql_col_out + </span><span style="color: #ff0000">‘‘</span><span style="color: #ff0000">,</span><span style="color: #ff0000">‘‘</span><span style="color: #ff0000">,</span><span style="color: #ff0000">‘‘‘‘</span><span style="color: #ff0000">) + QUOTENAME([</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@row2column</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">])
- FROM [</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@tableName</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">] </span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@sql_where</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000"> GROUP BY [</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@row2column</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">]</span><span style="color: #ff0000">‘</span>
- <span style="color: #008080">--</span><span style="color: #008080">PRINT @sql_str</span>
- <span style="color: #0000ff">EXEC</span> sp_executesql <span style="color: #008000">@sql_str</span>,N<span style="color: #ff0000">‘</span><span style="color: #ff0000">@sql_col_out NVARCHAR(MAX) OUTPUT</span><span style="color: #ff0000">‘</span>,<span style="color: #008000">@sql_col_out</span><span style="color: #808080">=</span><span style="color: #008000">@sql_col</span><span style="color: #000000"> OUTPUT
- </span><span style="color: #008080">--</span><span style="color: #008080">PRINT @sql_col</span>
- <span style="color: #0000ff">SET</span> <span style="color: #008000">@sql_str</span> <span style="color: #808080">=</span> N<span style="color: #ff0000">‘</span><span style="color: #ff0000">
- SELECT * FROM (
- SELECT [</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@groupColumn</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">],[</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@row2column</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">],[</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@row2columnValue</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">] FROM [</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@tableName</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">]</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@sql_where</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">) p PIVOT
- (SUM([</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@row2columnValue</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">]) FOR [</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@row2column</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">] IN ( </span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span> <span style="color: #008000">@sql_col</span> <span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">) ) AS pvt
- ORDER BY pvt.[</span><span style="color: #ff0000">‘</span><span style="color: #808080">+</span><span style="color: #008000">@groupColumn</span><span style="color: #808080">+</span><span style="color: #ff0000">‘</span><span style="color: #ff0000">]</span><span style="color: #ff0000">‘</span>
- <span style="color: #008080">--</span><span style="color: #008080">PRINT (@sql_str)</span>
- <span style="color: #0000ff">EXEC</span> (<span style="color: #008000">@sql_str</span><span style="color: #000000">)
- <img alt="技术分享" src="https://img.gxlcms.com//Uploads-s/new/2020-10-13-qlqqti/20180110222922229998.png"></span>
sqlserver 行转列
标签:测试表 arch print exe 测试 img 分组 class 设置