【发布时间】:2016-02-29 23:49:12
【问题描述】:
如何将 PONT_LOC 字段转换为每个值的单独字段,从而为每个 SECTION 和 SURVEY_DATE 组合创建一行,行数将始终非常基于 SECTION 和 SURVEY_DATE,有人可以帮忙吗? Oracle11g
SELECT * FROM (SELECT STATE_CODE||SHRP_ID AS SECTION, SURVEY_DATE, POINT_LOC
FROM (SELECT * FROM MON_DIS_JPCC_FAULT ORDER BY STATE_CODE, SHRP_ID, SURVEY_DATE, POINT_LOC)
WHERE STATE_CODE=55
AND SHRP_ID LIKE '0213'
AND CRACK_OR_JOINT='J'
AND SURVEY_DATE='04/27/1998');
+---------+-------------+-----------+
| SECTION | SURVEY_DATE | POINT_LOC |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 3.2 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 7.9 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 12.5 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 17.1 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 21.7 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 26.2 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 30.7 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 35.2 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 39.8 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 44.4 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 48.9 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 53.5 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 58 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 62.8 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 67.1 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 71.7 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 76.5 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 81.2 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 85.6 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 90.2 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 94.7 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 99.4 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 103.9 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 108.3 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 114 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 117.7 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 122.1 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 126.7 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 131.3 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 136 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 140.5 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 144.9 |
+---------+-------------+-----------+
| 550213 | 04/27/1998 | 149.4 |
+---------+-------------+-----------+
这是一些示例数据:
CREATE TABLE MON_DIS_JPCC_FAULT
(SECTION VARCHAR(255),
SURVEY_DATE VARCHAR(255),
POINT_LOC DECIMAL(3,1));
INSERT INTO MON_DIS_JPCC_FAULT
VALUES ('550213', '04/27/1998', 3.2);
INSERT INTO MON_DIS_JPCC_FAULT
VALUES ('550213', '04/27/1998', 7.9);
INSERT INTO MON_DIS_JPCC_FAULT
VALUES ('550213', '04/27/1998', 12.5);
INSERT INTO MON_DIS_JPCC_FAULT
VALUES ('550213', '04/27/1998', 17.1);
INSERT INTO MON_DIS_JPCC_FAULT
VALUES ('550213', '04/27/1998', 21.7);
我不知道我的解释是否正确...这是我正在寻找的输出示例:
+---------+-------------+-------------+-------------+-------------+-------------+-------------+
| SECTION | SURVEY_DATE | POINT_LOC_1 | POINT_LOC_2 | POINT_LOC_3 | POINT_LOC_4 | POINT_LOC_5 |...6, 7, 8, etc...
+---------+-------------+-------------+-------------+-------------+-------------+-------------+
| 550213 | 04/27/1998 | 3.2 | 7.9 | 12.5 | 17.1 | 21.7 |
+---------+-------------+-------------+-------------+-------------+-------------+-------------+
另外,POINT_LOC 的数量总是不同的。
我希望这是有道理的,非常感谢任何帮助!
好的,这就是我目前所拥有的:
SELECT * FROM (
SELECT STATE_CODE||SHRP_ID AS SECTION, SURVEY_DATE, ROW_NUMBER() OVER (PARTITION BY STATE_CODE, SHRP_ID, SURVEY_DATE ORDER BY STATE_CODE, SHRP_ID, SURVEY_DATE, POINT_LOC) AS "JOINT_NO", POINT_LOC
FROM MON_DIS_JPCC_FAULT
WHERE STATE_CODE=55
AND SHRP_ID IN ('0215','0216')
AND CRACK_OR_JOINT='J')
PIVOT (MAX("POINT_LOC") FOR JOINT_NO IN (1,2,3,4,5,34,35,36))
ORDER BY "SECTION", SURVEY_DATE
这是一个示例结果:
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| SECTION | SURVEY_DATE | 1 | 2 | 3 | 4 | 5 | 34 | 35 | 36 |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550215 | 04/28/1998 | 3.1 | 7.9 | 12.5 | 17.1 | 21.7 | - | - | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550215 | 06/08/2000 | 3.1 | 7.9 | 12.5 | 17.1 | 21.7 | - | - | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550215 | 04/22/2002 | 3.1 | 7.9 | 12.5 | 17.1 | 21.7 | - | - | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550215 | 08/15/2005 | 3.1 | 7.9 | 12.5 | 17.1 | 21.7 | - | - | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550215 | 05/12/2010 | 3.1 | 7.9 | 12.5 | 17.1 | 21.7 | - | - | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550215 | 07/31/2012 | 3.1 | 7.9 | 12.5 | 17.1 | 21.7 | - | - | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550216 | 04/24/1998 | 3 | 7.5 | 12 | 16.6 | 21.1 | 148 | 152.4 | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550216 | 06/06/2000 | 3 | 7.5 | 12 | 16.6 | 21.1 | 148 | 152.4 | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550216 | 04/16/2002 | 3 | 7.5 | 12 | 16.6 | 21.1 | 148 | 152.4 | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550216 | 08/12/2005 | 3 | 7.5 | 12 | 16.6 | 21.1 | 148 | 152.4 | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550216 | 05/05/2010 | 3 | 7.5 | 12 | 16.6 | 21.1 | 152.3 | 152.4 | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
| 550216 | 07/30/2012 | 3 | 7.5 | 12 | 16.6 | 21.1 | 148 | 152.4 | - |
+---------+-------------+-----+-----+------+------+------+-------+-------+----+
问题是每个 SECTION 的 POINT_LOC 的数量会有所不同,所以我需要 SQL 的“IN (1,2,3,4,5,34,35,36)”部分来首先确定行数,并且只包括那些。我试图添加一个子查询,但我不断收到“缺少表达式”错误,请帮助:-(
【问题讨论】: