首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过SQL语句将行列数据转换为行

通过SQL语句将行列数据转换为行
EN

Stack Overflow用户
提问于 2013-03-19 15:22:58
回答 1查看 1K关注 0票数 0

我目前在这里使用oracle 11g是我面临的问题。我有一条SQL语句,如下所示:

代码语言:javascript
运行
复制
 SELECT A.LM_PERSON_ID
 ,A.LM_GRADE
 ,C.COURSE_STR
 ,Decode (A.LM_GRADE,'001','1','002','2','003','3') AS JOB_GRADE


 FROM PS_LM_PERSON_JOB A
,PS_LM_LPLN_LRN B 
,PS_LM_LPLN_DTL C 
,PS_LM_ENRLMT D
,PS_LM_CI_TBL E 


WHERE A.LM_EMPL_RCD='0'
AND A.LM_EFFSEQ=(SELECT Max(A1.LM_EFFSEQ) FROM PS_LM_PERSON_JOB A1 
WHERE A.LM_PERSON_ID=A1.LM_PERSON_ID AND A.EFFDT=A1.EFFDT 
AND A.LM_EMPL_RCD=A1.LM_EMPL_RCD)
AND A.LM_ACTIVE='Y'
AND A.EFFDT=(SELECT Max(A2.EFFDT) FROM PS_LM_PERSON_JOB A2 
WHERE A.LM_PERSON_ID=A2.LM_PERSON_ID AND A.LM_EMPL_RCD=A2.LM_EMPL_RCD 
AND A.LM_EFFSEQ=A2.LM_EFFSEQ) 
AND A.LM_PERSON_ID=B.LM_PERSON_ID (+)  
AND B.LM_LPLN_ID=C.LM_LPLN_ID (+) 
AND B.LM_PERSON_ID=C.LM_PERSON_ID (+)
AND C.LM_ENRLMT_ID=D.LM_ENRLMT_ID (+)  
AND D.LM_CI_ID=E.LM_CI_ID (+)
AND E.EFFDT=(SELECT Max(E1.EFFDT) FROM PS_LM_CI_TBL E1 WHERE E.LM_CI_ID=E1.LM_CI_ID)


ORDER BY A.LM_PERSON_ID

我希望得到的输出是:

代码语言:javascript
运行
复制
  JOB GRADE   COURSE_STR.A    COURSE_STR.B    COURSE_STR.C 
    1              5               3               1
    2              4               2               2
    3              1               1               1

有人介意分享你是如何做到这一点的吗?非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 18:02:03

看一下PIVOT运算符,看看它是否能解决您的问题。

如果你提供了更多的信息,我可以尝试写你的查询。也许没有转换的查询结果的一个简单示例就足够了。

编辑:

让我们想象一下测试表:

代码语言:javascript
运行
复制
CREATE TABLE pivot_test (
  job_grade            NUMBER,
  course_str    VARCHAR2(1)
);

INSERT INTO pivot_test VALUES (1, 'A');
INSERT INTO pivot_test VALUES (1, 'B');
INSERT INTO pivot_test VALUES (1, 'C');
INSERT INTO pivot_test VALUES (1, 'A');
INSERT INTO pivot_test VALUES (1, 'C');
INSERT INTO pivot_test VALUES (2, 'A');
INSERT INTO pivot_test VALUES (2, 'B');
INSERT INTO pivot_test VALUES (2, 'C');
INSERT INTO pivot_test VALUES (2, 'A');
INSERT INTO pivot_test VALUES (3, 'A');
INSERT INTO pivot_test VALUES (3, 'A');
INSERT INTO pivot_test VALUES (3, 'A');
INSERT INTO pivot_test VALUES (3, 'A');
INSERT INTO pivot_test VALUES (3, 'A');
INSERT INTO pivot_test VALUES (3, 'B');
INSERT INTO pivot_test VALUES (3, 'B');
INSERT INTO pivot_test VALUES (3, 'A');
COMMIT;

我们的测试数据如下所示:

代码语言:javascript
运行
复制
select * from pivot_test;

 JOB_GRADE COURSE_STR
---------- ----------
         1 A
         1 B
         1 C
         1 A
         1 C
         2 A
         2 B
         2 C
         2 A
         3 A
         3 A
         3 A
         3 A
         3 A
         3 B
         3 B
         3 A

17 rows selected

现在我们应用PIVOT操作,并得到结果:

代码语言:javascript
运行
复制
SQL> SELECT *
  2        FROM pivot_test
  3        PIVOT(COUNT(course_str) FOR course_str IN('A' AS "COURSE_STR.A",
  4                                                  'B' AS "COURSE_STR.B",
  5                                                  'C' AS "COURSE_STR.C"));

 JOB_GRADE COURSE_STR.A COURSE_STR.B COURSE_STR.C
---------- ------------ ------------ ------------
         1            2            1            2
         2            2            1            1
         3            6            2            0

SQL>

我使用COUNT()作为聚合函数,但它可以是SUM()、MAX()等。

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15493658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档