SQL中的队列样式表(对角网格)

SQL中的队列样式表(对角网格),sql,postgresql,cross-join,oracle,sqlserver,Sql,Postgresql,Cross Join,Oracle,Sqlserver,我需要创建一个表,如下图所示: 我可以使用以下代码在sql中创建完整的9行表: select a.start_year, a.start_month, b.start_year as order_year, b.start_month as order_month from list a cross join list b; 如何删除不需要的行,或者一开始就不创建它们?在ORACLE 11g中 在SQL SERVER中 在PostgreSQL中

我需要创建一个表,如下图所示:

我可以使用以下代码在sql中创建完整的9行表:

   select a.start_year, a.start_month, b.start_year as order_year, 
          b.start_month as order_month
    from list a
    cross join list b; 
如何删除不需要的行,或者一开始就不创建它们?

在ORACLE 11g中

在SQL SERVER中

在PostgreSQL中

首先使用聚合函数计算最大值:

然后将结果输入交叉表函数,如相关答案中的详细说明所示

简单表单-不适合缺少的属性

具有一个参数的交叉表:

SELECT *
FROM   crosstab(
      'SELECT x,y, z
       FROM   table_name
       ORDER  BY 1,2')  -- needs to be "ORDER BY 1,2" here
AS ct ("X" text, "1" text, "2" text, "3" text);
返回:

   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |  f  |     |     
   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |     |     |  f 
不需要强制转换和重命名。 注意,C的结果不正确,第一列中填写了值f。 安全形式

具有两个参数的交叉表:

SELECT * FROM crosstab(
       'SELECT x, y, z
        FROM   table_name
        ORDER  BY 1,2'  -- could also just be "ORDER BY 1" here

      ,$$VALUES ('1'::text), ('2'), ('3')$$)
AS ct ("X" text, "1" text, "2" text, "3" text);
返回:

   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |  f  |     |     
   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |     |     |  f 
注意C的正确结果

第二个参数可以是每个查询返回一行的任何查询 与列定义在末尾的顺序匹配的属性。 通常,您会希望从底层查询不同的属性 如下表所示:

'SELECT DISTINCT attribute FROM table_name ORDER BY 1'
手册上有

因为您必须拼出列定义列表中的所有列 无论如何,除了预定义的crosstabN变体,它是定期的 在像I这样的值表达式中提供短列表更有效 证明:

$$VALUES ('1'::text), ('2'), ('3')$$)
或:

手册上没有

我过去常常使报价更容易

在ORACLE 11g中

在SQL SERVER中

在PostgreSQL中

首先使用聚合函数计算最大值:

然后将结果输入交叉表函数,如相关答案中的详细说明所示

简单表单-不适合缺少的属性

具有一个参数的交叉表:

SELECT *
FROM   crosstab(
      'SELECT x,y, z
       FROM   table_name
       ORDER  BY 1,2')  -- needs to be "ORDER BY 1,2" here
AS ct ("X" text, "1" text, "2" text, "3" text);
返回:

   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |  f  |     |     
   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |     |     |  f 
不需要强制转换和重命名。 注意,C的结果不正确,第一列中填写了值f。 安全形式

具有两个参数的交叉表:

SELECT * FROM crosstab(
       'SELECT x, y, z
        FROM   table_name
        ORDER  BY 1,2'  -- could also just be "ORDER BY 1" here

      ,$$VALUES ('1'::text), ('2'), ('3')$$)
AS ct ("X" text, "1" text, "2" text, "3" text);
返回:

   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |  f  |     |     
   x    |  1  |  2  |  3  
--------+-----+-----+-----
   A    |  a  |  b  |  c  
   B    |  d  |  e  |     
   C    |     |     |  f 
注意C的正确结果

第二个参数可以是每个查询返回一行的任何查询 与列定义在末尾的顺序匹配的属性。 通常,您会希望从底层查询不同的属性 如下表所示:

'SELECT DISTINCT attribute FROM table_name ORDER BY 1'
手册上有

因为您必须拼出列定义列表中的所有列 无论如何,除了预定义的crosstabN变体,它是定期的 在像I这样的值表达式中提供短列表更有效 证明:

$$VALUES ('1'::text), ('2'), ('3')$$)
或:

手册上没有

我过去常常使报价更容易


最好将示例数据发布为文本,甚至插入到语句中。最好将示例数据发布为文本,或者甚至插入到语句中。谢谢@a_horse_和\u no_名称作为指导。手册中记录了values子句:谢谢@a_horse_和\u no_名称。谢谢@a_horse和\u no_名称作为指导。手册中记录了values子句:谢谢@a_horse和\u no_名称。