SQL中的队列样式表(对角网格)
我需要创建一个表,如下图所示: 我可以使用以下代码在sql中创建完整的9行表: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中
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_名称。