【问题标题】:Get part of the result into columns instead of lines将部分结果放入列而不是行
【发布时间】:2019-08-26 08:05:01
【问题描述】:

我对内部和外部培训有疑问。每次培训都有 1 个或多个演讲者。我想要的是为每个演讲者提供一个专栏。

我正在检查聚合函数,但找不到解决我问题的函数。

select  e.sid
       , e.access_kz EXTERN1
       , z.zuname VERTRETERPERSONAL1
  from MDEV e
    join MDEVCAL ec on (ec.klient_id = e.klient_id and ec.EV_sid = e.sid) 
    left outer join MDEVCALS ecs on (ecs.klient_id = e.klient_id and ecs.ev_sid = e.sid and ecs.evcal_sid = ec.sid) 
    left outer join MDZHD z on (z.klient_id = e.klient_id and z.sid = ecs.MDZHD_SID)

我使用左外连接,因为训练不一定要有演讲者,但可以有 X 个不同的演讲者

我想要的是这样的:

SID | Extern1 | VERTRETERPERSONAL1 | VERTRETERPERSONAL2 | VERTRETERPERSONAL3 ...

【问题讨论】:

  • 那么你想要代表每个训练者对训练的列数吗?动态列数?
  • 是的,结果应该是这样。
  • 单个查询不会为您提供这样的结果,因为 SQL 引擎在执行查询之前必须知道许多列。如果您愿意使用 PL/SQL,我们可以提供帮助。
  • 我的问题是在这种情况下我不能使用 PL SQL。 (它是一个报表查询,不支持 PL SQL)。如果为查询提供静态数量的培训师是可能的吗?例如,如果我说我只想要前两名培训师?
  • 是的,可以使用静态训练器

标签: sql oracle pivot


【解决方案1】:

我认为以下查询将解决您的问题,但使用的是静态培训师列表。

SELECT
    *
FROM
    (
        SELECT
            E.SID,
            E.ACCESS_KZ   EXTERN1,
            Z.ZUNAME      VERTRETERPERSONAL
        FROM
            MDEV E
            JOIN MDEVCAL EC ON ( EC.KLIENT_ID = E.KLIENT_ID
                                 AND EC.EV_SID = E.SID )
            LEFT OUTER JOIN MDEVCALS ECS ON ( ECS.KLIENT_ID = E.KLIENT_ID
                                              AND ECS.EV_SID = E.SID
                                              AND ECS.EVCAL_SID = EC.SID )
            LEFT OUTER JOIN MDZHD Z ON ( Z.KLIENT_ID = E.KLIENT_ID
                                         AND Z.SID = ECS.MDZHD_SID )
    ) PIVOT (
        MAX ( VERTRETERPERSONAL )
        FOR VERTRETERPERSONAL
        IN ( '<VERTRETERPERSONAL_NAME1>' AS VERTRETERPERSONAL1, '<VERTRETERPERSONAL_NAME2>' AS VERTRETERPERSONAL2, .... )
    );

干杯!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多