SQL输出矩阵

原文:SQL输出矩阵

数据库环境:SQL SERVER2008R2

需求:用SQL实现如下2个图中的矩阵。

          

图1和图2都是行列转换的另一个变形,下面直接贴上SQL脚本。

图1的SQL实现

/*利用系统的数字辅助表,生成1-25及每连续5个数一组的组号(从1开始)*/
WITH    x0
          AS ( SELECT   ( number - 1 ) / 5 + 1 AS cn ,
                        number AS seq
               FROM     master..spt_values
               WHERE    number <= 25
                        AND number >= 1
                        AND type = 'P'
             ),/*新增一列,按组内降序排序,及在同组内从大到小排序*/
        x1
          AS ( SELECT TOP 25
                        cn ,
                        seq ,
                        ROW_NUMBER() OVER ( ORDER BY cn, seq DESC ) dseq
               FROM     x0
               ORDER BY cn ,
                        seq
             )
    /*如果是单行号,则升序;否则,降序*/
    SELECT  MAX(CASE seq % 5
                  WHEN 1 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS A ,
            MAX(CASE seq % 5
                  WHEN 2 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS B ,
            MAX(CASE seq % 5
                  WHEN 3 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS C ,
            MAX(CASE seq % 5
                  WHEN 4 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS D ,
            MAX(CASE seq % 5
                  WHEN 0 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS E
    FROM    x1
    GROUP BY cn

图2的SQL实现

/*利用系统的数字辅助表,生成1-25及每连续5个数一组的组号(从1开始)*/
WITH    x0
          AS ( SELECT   ( number - 1 ) / 5 + 1 AS cn ,
                        number AS seq
               FROM     master..spt_values
               WHERE    number <= 25
                        AND number >= 1
                        AND type = 'P'
             ),/*新增一列,按组内降序排序,及在同组内从大到小排序*/
        x1
          AS ( SELECT TOP 25
                        cn ,
                        seq ,
                        ROW_NUMBER() OVER ( ORDER BY cn, seq DESC ) dseq
               FROM     x0
               ORDER BY cn ,
                        seq
             ),/*按对5求余的规则新生成一个组号,根据原组号取整组的数据*/
        x2
          AS ( SELECT   seq % 5 AS sno ,
                        CASE cn
                          WHEN 1 THEN seq
                        END AS A ,
                        CASE cn
                          WHEN 2 THEN dseq
                        END AS B ,
                        CASE cn
                          WHEN 3 THEN seq
                        END AS C ,
                        CASE cn
                          WHEN 4 THEN dseq
                        END AS D ,
                        CASE cn
                          WHEN 5 THEN seq
                        END AS E
               FROM     x1
             )
    /*按新组号分组,排序*/
    SELECT  MAX(A) AS A ,
            MAX(B) AS B ,
            MAX(C) AS C ,
            MAX(D) AS D ,
            MAX(E) AS E
    FROM    x2
    GROUP BY sno
    ORDER BY A

当然,实现的方法不局限于上述2种。欢迎提出更好的解决思路。

时间: 2024-09-26 09:34:10

SQL输出矩阵的相关文章

sql-为什么这两句我看似一样的SQL输出的结果不一样?

问题描述 为什么这两句我看似一样的SQL输出的结果不一样? 3C SELECT splname FROM qsplWHERE splno NOT IN(SELECT splno FROM qdelWHERE itemname = 'Compass'OR itemname = 'Geopositioning System'); Select splnameFrom qdel aqspl bWhere a.splno=b.splnoAnd (a.itemname != ('Compass') or

hibernate sql输出问题

问题描述 hibernate sql输出问题 2015-07-08 11:28:00,085 [DefaultQuartzScheduler_Worker-9] DEBUG [org.hibernate.hql.ast.AST] - --- SQL AST --- -[SELECT] QueryNode: 'SELECT' querySpaces (hc_vm_expiremail_log) +-[SELECT_CLAUSE] SelectClause: '{derived select cla

EOS 控制台SQL输出

问题描述 大家有人用过EOS的么?小虾刚刚接触有问题想请教大师了啊.为什么EOS控制台不能SQL输出,如果可以怎么配置

在ASP.NET中显示Linq To SQL输出的SQL语句

最近在使用Linq To SQL的时候,为了了解不同Linq语句对性能造成的不同影响,需要获得Linq To SQL生成的SQL语句. 如果是在桌面程序中,只需要 _context.Log = Console.Out; 即可在控制台输出SQL语句.可是在ASP.NET中又该怎么办呢? 这时我想起了StringWriter.用它就可以代替Console.Out帮我们接收输出的日志,保存在一个StringBuilder里. 于是构造一个辅助类: using System; using System.

MySQL EXPLAIN SQL 输出信息描述

EXPLAIN语句能够被用于获取一些关于SQL执行时的相关信息,比如表的连接顺序,对表的方式方式等等.通过对该相关信息进行进一步的分析,我们 可以通过对表添加适当的索引,以及优化连接顺序,使用提示等等手段来达到使SQL高效运行的目的.本文描述了EXPLAIN的用法并给出了相关示例. 一.EXPLAIN概述 EXPLAIN 语句主要是用于解析SQL执行计划,通过分析执行计划采取适当的优化方式提高SQL运行的效率. EXPLAIN 语句输出通常包括id列,select_type,table,type

java逆时针螺旋输出矩阵

import java.util.Scanner; /**  *@author Sun  * @since  * @version 1.0  *   **/ public class test1 {public static void main(String args[]) {//获取传入的值Scanner sc=new Scanner(System.in);int nextInt = sc.nextInt();int[][] arr = gettx(nextInt, nextInt);//逆时

Java使用输入框填写行列值并输出矩阵表

import javax.swing.*; public class Lesson23 { public static void main ( String [] args ) { int SHI; // 循环检测程序 ! do { //输入框检测程序 ! System.out.println( "" ); System.out.println( "" ); String Hang = JOptionPane.showInputDialog( " 请输入图

-SQL 输出2010年的所有周末

declare @date datetime='2010-01-01'; while(Year(@date)=2010) begin if(DATEPART(WEEKDAY,@date) in (1,7)) begin print @date end select @date=DateAdd(DAY,1,@date); end

在 IIS 中配置 SQL XML 支持

首先,说一下我们的例子目的--一让数据库输出XML,并且在.net体系下调用出来.      这个系统的数据层是用SQL server数据库,中间层就用SQL自带的工具"在 IIS 中配置SQL XML 支持"实现就可以了.好的,现在我们开始来做了,首先配置让SQL 输出 XML :      这个东西听起来似乎有些神秘,其实就是在我们普通的查询语句后边增加:FOR XML AUTO 就可以了.     举一个例子:       SELECT TOP 100 topic,name,ti