c# - 给定单个数据库表,是否可以在 sql 查询中生成报告矩阵作为结果集

标签 c# sql sql-server

给定以下 SQL 表:

GroupAvailable, GroupAssigned, Title
----------------------------------------
GroupA,GroupA,Widget1
GroupA,GroupB,Widget1
GroupB,GroupA,Widget1

需要一个看起来像这样的报告:

Widget1
               GroupA     GroupB

GroupA           X          X
GroupB           X


Widget2
etc.

这可以在查询中进行吗?或者非常接近的东西?或者代码和 sql 的组合会更好吗?

最佳答案

PIVOT函数将使您接近结果:

select name, 
  coalesce(GroupA, '') GroupA, 
  coalesce(GroupB, '') GroupB
from
(
  select title +' '+ groupavailable name,
    groupassigned,
    'X' as flag
  from yourtable
) d
pivot
(
  max(flag)
  for groupassigned in (GroupA, GroupB)
) piv;

参见 SQL Fiddle with Demo .

如果您有未知数量的组,那么您可以使用动态 SQL 来获取结果:

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

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

select @colsNull = STUFF((SELECT distinct ', coalesce(' + QUOTENAME(GroupAvailable)+', '''') as '+QUOTENAME(GroupAvailable)
                    from yourtable 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT name,' + @colsNull + ' 
            from 
            (
                select title +'' ''+ groupavailable name,
                  groupassigned,
                  ''X'' as flag
                from yourtable
            ) x
            pivot 
            (
                max(flag)
                for groupassigned in (' + @cols + ')
            ) p '

execute(@query);

参见 SQL Fiddle with Demo

两个版本都会给出一个结果:

|           NAME | GROUPA | GROUPB |
------------------------------------
| Widget1 GroupA |      X |      X |
| Widget1 GroupB |      X |        |
| Widget2 GroupB |      X |        |

关于c# - 给定单个数据库表,是否可以在 sql 查询中生成报告矩阵作为结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559732/

相关文章:

c# - LINQ 查询使用运行程序的机器或托管数据库的服务器的处理能力吗?

sql-server - 如何确定 SQL Server 中服务器的 MAXDOP 设置?

sql - 考虑到任何列是否包含 0 那么它不应该参与比较,如何从单行中的多个列中找到最小值

c# - EntityFramework 上下文中的 SaveChanges() 静默失败

c# - Moq httpclient 第二次返回空字符串

sql - 替换SQL中的多个字符

SQL 字符串让我抓狂

c# - Fluent Nhibernate 在新的父级和子级上保存 child.parentid =parentId

C# 为什么不能在 winform 构造函数中设置 GUI 特定操作?

sql - 如何从这段丑陋的代码中重写 "where, and, or"语句