所以,这是表格-
create table person (
id number,
name varchar2(50)
);
create table injury_place (
id number,
place varchar2(50)
);
create table person_injuryPlace_map (
person_id number,
injury_id number
);
insert into person values (1, 'Adam');
insert into person values (2, 'Lohan');
insert into person values (3, 'Mary');
insert into person values (4, 'John');
insert into person values (5, 'Sam');
insert into injury_place values (1, 'kitchen');
insert into injury_place values (2, 'Washroom');
insert into injury_place values (3, 'Rooftop');
insert into injury_place values (4, 'Garden');
insert into person_injuryPlace_map values (1, 2);
insert into person_injuryPlace_map values (2, 3);
insert into person_injuryPlace_map values (1, 4);
insert into person_injuryPlace_map values (3, 2);
insert into person_injuryPlace_map values (4, 4);
insert into person_injuryPlace_map values (5, 2);
insert into person_injuryPlace_map values (1, 1);
在这里,表格person_injuryPlace_map
只会映射其他两个表格。
我想要显示数据的方式是-
Kitchen Pct Washroom Pct Rooftop Pct Garden Pct
-----------------------------------------------------------------------
1 14.29% 3 42.86% 1 14.29% 2 28.57%
在这里,“厨房”,“洗手间”,“屋顶”,“花园”列的值是发生的事件总数。“百分比”列将显示总计数的百分比。
如何在Oracle SQL中做到这一点?
您需要使用标准的 PIVOT 查询。
根据您的 Oracle数据库版本 ,您可以通过以下两种方式进行操作:
将 PIVOT 用于 11g 及更高 版本 :
SQL> SELECT *
2 FROM
3 (SELECT c.place place,
4 row_number() OVER(PARTITION BY c.place ORDER BY NULL) cnt,
5 (row_number() OVER(PARTITION BY c.place ORDER BY NULL)/
6 COUNT(place) OVER(ORDER BY NULL))*100 pct
7 FROM person_injuryPlace_map A
8 JOIN person b
9 ON(A.person_id = b.ID)
10 JOIN injury_place c
11 ON(A.injury_id = c.ID)
12 ORDER BY c.place
13 ) PIVOT (MAX(cnt),
14 MAX(pct) pct
15 FOR (place) IN ('kitchen' AS kitchen,
16 'Washroom' AS Washroom,
17 'Rooftop' AS Rooftop,
18 'Garden' AS Garden));
KITCHEN KITCHEN_PCT WASHROOM WASHROOM_PCT ROOFTOP ROOFTOP_PCT GARDEN GARDEN_PCT
---------- ----------- ---------- ------------ ---------- ----------- ---------- ----------
1 14.2857143 3 42.8571429 1 14.2857143 2 28.5714286
在 版本10g* 及之前的 版本中 使用 MAX 和 DECODE : *
SQL> SELECT MAX(DECODE(t.place,'kitchen',cnt)) Kitchen ,
2 MAX(DECODE(t.place,'kitchen',pct)) Pct ,
3 MAX(DECODE(t.place,'Washroom',cnt)) Washroom ,
4 MAX(DECODE(t.place,'Washroom',pct)) Pct ,
5 MAX(DECODE(t.place,'Rooftop',cnt)) Rooftop ,
6 MAX(DECODE(t.place,'Rooftop',pct)) Pct ,
7 MAX(DECODE(t.place,'Garden',cnt)) Garden ,
8 MAX(DECODE(t.place,'Garden',pct)) Pct
9 FROM
10 (SELECT b.ID bid,
11 b.NAME NAME,
12 c.ID cid,
13 c.place place,
14 row_number() OVER(PARTITION BY c.place ORDER BY NULL) cnt,
15 ROUND((row_number() OVER(PARTITION BY c.place ORDER BY NULL)/
16 COUNT(place) OVER(ORDER BY NULL))*100, 2) pct
17 FROM person_injuryPlace_map A
18 JOIN person b
19 ON(A.person_id = b.ID)
20 JOIN injury_place c
21 ON(A.injury_id = c.ID)
22 ORDER BY c.place
23 ) t;
KITCHEN PCT WASHROOM PCT ROOFTOP PCT GARDEN PCT
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 14.29 3 42.86 1 14.29 2 28.57
问题内容: 在访问我的数据库时,我让用户填写了一个表单,并且在目标页面中,发布的值用于生成的MySQL查询中。 但是,由于某种原因,MySQL不喜欢我在命令中使用$ _POST变量,并且仅当我定义(例如)然后将$ user直接放在SQL命令中时,MySQL才起作用。 另一方面,我可以在不需要特定列名的INSERT语句中使用$ _POST值: 如果我尝试在INSERT语句中定义了属性(例如),则会出
我无法将Gatling的数据实时发送到influxDB。 我在Windows10上。加特林版本:2.3.0(最后一个)。InflxDB版本:1.3.5(最后一个是1.3.6)。 我的Gatling.conf: 我连接到inflxdb 我连接到我的数据库了。然后: 和 安东尼
问题内容: 鉴于我有一个类似以下的表格: 日程 员工表 如果我必须计算每个员工类型和每个班次的每个部门的总成本,该如何在sql中执行此操作? 假设如果包括午夜在内,我的工资将乘以25%? 我有以下示例输出,但不知道如何执行此操作?: 到目前为止,这是我的sql语句:但是,如何使它起作用?编辑1: 编辑2: 我收到以下错误,但似乎无法找出原因? 您的SQL语法有误;检查与您的MariaDB服务器版本
我正在尝试基于另一个具有lon的表创建geom表。我试图在表中创建两列,一列使用Spherical Mercator(SRID 4326,地理坐标系),另一列使用投影坐标系(SRID 3857)。以下是我的查询。 我收到以下错误 但是,如果我删除第二个select语句,它工作正常,我的意思是如果sql查询如下所示 如何使用第二个选择语句,如果它正常查询,我们可以使用从语句中选择。但是在这种情况下如
问题内容: 我已经实现了使用ojdbc6将UDT对象绑定到准备好的语句的功能。现在,我的一些UDT包含数组。我现在需要做的是: 为了构造Oracle阵列,我需要一个JDBC连接。通常,这样做是这样的: 但是,在那种方法中,我没有连接。另外,由于在一个简洁的问题中难以解释的原因,我无法在中维护连接引用。我可以以某种方式提取该连接吗?我想避免使用不稳定的结构,例如: 有任何想法吗?备择方案? 问题答案
问题内容: 我该怎么做? 在Oracle 11g中 ? 问题答案: 如果只想选择第一行,则可以: 您还可以使用分析函数对前x进行排序和取值: