AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 50811
Accepted
Lumpy
Lumpy
Asked: 2013-10-02 06:10:57 +0800 CST2013-10-02 06:10:57 +0800 CST 2013-10-02 06:10:57 +0800 CST

选择行数据作为列列表

  • 772

在我的数据库中,我有一组可由客户设置的自定义字段值。他们可以为这些字段创建标签,然后分配链接回数据库中特定表的值。我需要能够报告此信息,以便标签显示为列并且值在下面列出。我可以使用 PIVOT 函数来做到这一点,只是值中的信息不一定是可聚合的。(我正在编新词)我正在使用以下代码进行测试。

create table custlabel (custlabelid int identity(1,1) not null, custlabel varchar(50))
CREATE table custvalue (custvalueid int identity(1,1) not null, custlabelid int not null, custvalue varchar(50), linkageid int not null)
create table linkage (linkageid int identity(1,1), blah varchar(50))

INSERT into linkage(blah)
values('test'), ('test2'), ('test3')

INSERT INTO custlabel(custlabel)
values('info1'), ('info2'), ('info3'), ('info4'), ('info5')

INSERT INTO custvalue(custlabelid, custvalue, linkageid)
VALUES(1, 'info1 value1', 1),
(1, 'info1 value2', 1),
(1, 'info1 value3', 1),
(2, 'info2 value1', 1),
(2, 'info2 value2', 1),
(2, 'info2 value3', 1),
(2, 'info2 value4', 1),
(3, 'info3 value1', 1),
(3, 'info3 value2', 1),
(3, 'info3 value3', 1),
(4, 'info4 value1', 1)

我需要看到的是

blah, info1, info2, info3, info4, info5
test, info1 value1, info2 value1, info3 value1, NULL, NULL
test, info1 value2, info2 value2, info3 value2, NULL, NULL
test, info1 value3, info2 value3, info3 value3, NULL, NULL
test, info4 value1, NULL, NULL, NULL, NULL
sql-server-2008-r2 pivot
  • 1 1 个回答
  • 6372 Views

1 个回答

  • Voted
  1. Best Answer
    Taryn
    2013-10-02T06:36:34+08:002013-10-02T06:36:34+08:00

    您仍然应该能够使用PIVOT函数获得所需的结果。如果您需要聚合的值是一个字符串,那么您将使用minormax来获得最终结果。

    根据您的样本数据和所需的结果,您将需要生成一个独特的值,该值将在 PIVOT 中进行分组时使用。我将使用row_number()为每个blah和创建一个序列号custlabel,这将允许您为每个返回多行blah。

    如果您的 数量有限custlabels,则可以对查询进行硬编码:

    select blah, info1, info2, info3, info4, info5
    from
    (
      select cl.custlabel,
        cv.custvalue,
        l.blah
        , row_number() over(partition by l.blah, cl.custlabel
                          order by cl.custlabel) seq
      from custlabel cl
      inner join custvalue cv
        on cl.custlabelid = cv.custlabelid
      inner join linkage l
        on cv.linkageid = l.linkageid
    ) d
    pivot
    (
      max(custvalue)
      for custlabel in (info1, info2, info3, info4, info5)
    ) piv;
    

    请参阅SQL Fiddle with Demo。

    但是,如果您将拥有未知数量的custlabels,那么您将需要考虑使用动态 SQL 来获得最终结果:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(custlabel) 
                        from custlabel
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT blah, ' + @cols + ' 
                from 
                (
                  select cl.custlabel,
                    cv.custvalue,
                    l.blah
                    , row_number() over(partition by l.blah, cl.custlabel
                                      order by cl.custlabel) seq
                  from custlabel cl
                  inner join custvalue cv
                    on cl.custlabelid = cv.custlabelid
                  inner join linkage l
                    on cv.linkageid = l.linkageid
                ) x
                pivot 
                (
                    max(custvalue)
                    for custlabel in (' + @cols + ')
                ) p '
    
    execute sp_executesql @query;
    

    请参阅带有演示的 SQL Fiddle

    两个版本都会给出结果:

    | BLAH |        INFO1 |        INFO2 |        INFO3 |        INFO4 |  INFO5 |
    | test | info1 value1 | info2 value1 | info3 value1 | info4 value1 | (null) |
    | test | info1 value2 | info2 value2 | info3 value2 |       (null) | (null) |
    | test | info1 value3 | info2 value3 | info3 value3 |       (null) | (null) |
    | test |       (null) | info2 value4 |       (null) |       (null) | (null) |
    
    • 2

相关问题

  • SQL Server 2008 R2 中的自动收缩、加密和恢复模型属性

  • SQL Server 2008 R2 群集的无人参与安装失败并出现错误 - “路径中有非法字符”。

  • 迁移大型数据库

  • 代理执行的维护计划

  • 随机化表内容并将它们存储回表中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve