加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将列转换为列,不使用聚合

发布时间:2020-12-14 00:47:16 所属栏目:百科 来源:网络整理
导读:试图想出如何写一个动态的pivot sql语句.其中TEST_NAME最多可以有12个不同的值(因此有12列).一些VAL将是Int,Decimal或Varchar数据类型.我所看到的大多数例子都包括了一些.我正在寻找一个直观的枢纽. Source Table ╔═══════════╦══════╦
试图想出如何写一个动态的pivot sql语句.其中TEST_NAME最多可以有12个不同的值(因此有12列).一些VAL将是Int,Decimal或Varchar数据类型.我所看到的大多数例子都包括了一些.我正在寻找一个直观的枢纽.
Source Table 

╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║  VAL  ║
╠═══════════╬══════╬═══════╣
║ Test1     ║    1 ║ 0.304 ║
║ Test1     ║    2 ║ 0.31  ║
║ Test1     ║    3 ║ 0.306 ║
║ Test2     ║    1 ║ 2.3   ║
║ Test2     ║    2 ║ 2.5   ║
║ Test2     ║    3 ║ 2.4   ║
║ Test3     ║    1 ║ PASS  ║
║ Test3     ║    2 ║ PASS  ║
╚═══════════╩══════╩═══════╝


Desired Output 
╔══════════════════════════╗
║ SBNO Test1 Test2   Test3 ║
╠══════════════════════════╣
║ 1    0.304  2.3    PASS  ║
║ 2    0.31   2.5    PASS  ║
║ 3    0.306  2.4    NULL  ║
╚══════════════════════════╝
PIVOT功能需要聚合才能使其工作.看来你的VAL列是一个varchar,所以你必须使用MAX或MIN聚合函数.

如果测试次数有限,则可以对值进行硬编码:

select sbno,Test1,Test2,Test3
from
(
  select test_name,sbno,val
  from yourtable
) d
pivot
(
  max(val)
  for test_name in (Test1,Test3)
) piv;

见SQL Fiddle with Demo.

在您的OP中,您表示您将有更多的行转成列.如果是这样,那么可以使用动态SQL:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) 
                    from yourtable
            FOR XML PATH(''),TYPE
            ).value('.','NVARCHAR(MAX)'),1,'')

set @query = 'SELECT sbno,' + @cols + '
             from 
             (
                select test_name,val
                from yourtable
            ) x
            pivot 
            (
                max(val)
                for test_name in (' + @cols + ')
            ) p '

execute(@query)

见SQL Fiddle with Demo.

两个版本都会得到相同的结果:

| SBNO | TEST1 | TEST2 |  TEST3 |
---------------------------------
|    1 | 0.304 |   2.3 |   PASS |
|    2 |  0.31 |   2.5 |   PASS |
|    3 | 0.306 |   2.4 | (null) |

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读