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 / 问题 / 23232
Accepted
Vaccano
Vaccano
Asked: 2012-08-28 14:36:36 +0800 CST2012-08-28 14:36:36 +0800 CST 2012-08-28 14:36:36 +0800 CST

如何将查询结果转换成一组普通结果

  • 772

我有一个查询返回这样的结果:

     MyValue        MyGroup
_______________|_______________
       56      |      I
_______________|_______________
       12      |      I
_______________|_______________
       56      |      II
_______________|_______________
       12      |      II
_______________|_______________
       56      |      III
_______________|_______________
       56      |      IV
_______________|_______________
       56      |      V
_______________|_______________
       12      |      V
_______________|_______________

我需要把它转换成这样的东西:

      ColA           ColB             ColC            ColD           Count
_______________|_______________|_______________|_______________|_______________
       12      |      56              null            null             3
_______________|_______________|_______________|_______________|_______________
       56      |      null            null            null             2
_______________|_______________|_______________|_______________|_______________

我知道我可以设置一个迭代器并遍历我的表的所有行并构造这个结果。

但我认为还有另一种“基于集合”的方式。也许是“交叉应用”或“枢轴”。

但无论我阅读文档或查看这些文档的示例多少次,我似乎都无法充分理解它们来编写自己的文档。

有人有建议吗?

注意:以防万一,假设我获取第一个结果的查询如下所示:

select MyValue, MyGroup
from SomeTable

(它实际上是一组复杂的 CTE,但如果需要我可以添加另一层。)

sql-server pivot
  • 3 3 个回答
  • 143 Views

3 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-08-29T10:37:29+08:002012-08-29T10:37:29+08:00

    似乎更简单的方法:

    SELECT GroupValue = Val, [Count] = COUNT(DISTINCT MyGroup) FROM 
    (
      SELECT MyGroup, Val = STUFF((SELECT ', ' + RTRIM(MyValue) 
       FROM dbo.MyTable WHERE MyGroup = t.MyGroup FOR XML PATH('')), 1, 2, '')
      FROM dbo.MyTable AS t
    ) AS x GROUP BY Val;
    
    • 1
  2. Edward Dortland
    2012-08-28T20:43:34+08:002012-08-28T20:43:34+08:00
    DECLARE @columns VARCHAR(8000)
    
    SELECT @columns = COALESCE(@columns + ',[' + Mygroup + ']',
    '[' + Mygroup+ ']')
    FROM MyTable
    GROUP BY Mygroup
    
    
    DECLARE @query VARCHAR(8000)
    
    SET @query = '
    SELECT *
    FROM (  select MyGroup,
            MyValue, 
            Row_number() over ( partition by Mygroup 
                                Order by Mygroup) as rownum 
            from Mytable) a         
    PIVOT
    (
    MAX(MyValue)
    FOR [MyGroup]
    IN (' + @columns + ')
    )
    AS p'
    
    EXECUTE(@query)
    
    • 0
  3. Vaccano
    2012-08-29T09:31:23+08:002012-08-29T09:31:23+08:00

    这就是我要找的东西:

    -- Setup the table
    create table dbo.MyTable(MyValue int, MyGroup varchar(5))
    insert into dbo.MyTable values
    (56,'I'), (12,'I'), (56, 'II'), (12, 'II'), (56, 'III'), (56, 'IV'), (56, 'V'), (12, 'V')
    
    -- Create a function to cross apply with
    create function dbo.GetOrderGroup(@groupName varchar(15))
    returns @ReturnTable table(GroupValue varchar(8000), GroupName varchar(15))
    as                
    begin
        DECLARE @groupValue VARCHAR(8000)
    
        SELECT @groupValue = COALESCE(@groupValue + ', ' 
               + cast(MyValue as VARCHAR(10)), cast(MyValue as VARCHAR(10)))
        FROM MyTable
        where MyGroup = @groupName
    
        insert into @ReturnTable(GroupValue, GroupName)
        SELECT @groupValue, @groupName 
        return;
    end;
    go
    
    -- cross apply and get the distinct values
    SELECT  grp.GroupValue, count(distinct (grp.GroupValue + grp.GroupName)) as 'Count'
    from    MyTable tbl (NOLOCK)
            cross apply dbo.GetOrderGroup(tbl.MyGroup) grp
    GROUP BY grp.GroupValue
    

    它返回:

       GroupValue         Count
    _________________|______________
        12, 56       |      3
    _________________|______________
          56         |      2
    _________________|______________
    

    这足够接近我所需要的。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

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

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • 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
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +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