Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle group by SQL查询匹配varchar字段_Oracle_Group By - Fatal编程技术网

Oracle group by SQL查询匹配varchar字段

Oracle group by SQL查询匹配varchar字段,oracle,group-by,Oracle,Group By,我有一个表结构(我没有设计也不能更改),它使用varchar字段来存储关于实体的属性。我想编写一个SQL查询来搜索两个属性,并将多个结果行合并到一行中。为了说明这一点,我的表格与此类似: company ============= | id | name | ------------- | 1 | co1 | | 2 | co2 | | 3 | co3 | ============= agent ==================================== | id |

我有一个表结构(我没有设计也不能更改),它使用
varchar
字段来存储关于实体的属性。我想编写一个SQL查询来搜索两个属性,并将多个结果行合并到一行中。为了说明这一点,我的表格与此类似:

company
=============
| id | name |
-------------
|  1 |  co1 |
|  2 |  co2 |
|  3 |  co3 |
=============

agent
====================================
| id | name | company_id |   type  |
------------------------------------
|  1 |  Tom |          1 | 'type1' |
|  2 |  Bob |          1 | 'type2' |
|  3 | Bill |          2 | 'type1' |
|  4 | Jack |          2 | 'type2' |
|  5 | John |          3 | 'type1' |
|  6 |  Joe |          3 | 'type2' |
====================================
type1
type2
作为有效值硬编码到软件中(同样,我没有编写),因此搜索这些值应该是成功的(允许为空)。因此,我必须根据这些值进行搜索

作为新手,我可以编写以下SQL:

select c.name, a.name, a.type
from company c
inner join agent a on c.id = a.company_id
并在我的软件(Java程序)中对这些结果进行排序:

但是,我希望有一种方法可以将这些行组合成更高效的行:

-- my failed attempt at writing this query
select c.name, a.name as type_1_agent, a.name as type_2_agent
from company c
inner join agent a on c.id = a.company_id
group by c.id -- ?
where -- ?

results:

======================================
| name | type_1_agent | type_2_agent |
--------------------------------------
|  co1 |          Tom |          Bob |
|  co2 |         Bill |         Jack |
|  co3 |         John |          Joe |
======================================

这可能吗?

您可以通过PIVOT功能实现这一点,如下所示:

select company,type_1_agent,type_2_agent
from
(select a.name as agentname, a.type as agenttype,c.name as company
from agent a
inner join company c on c.id = a.company_id
) s
pivot
(max(agentname) for agenttype in ('type1' type_1_agent,'type2' type_2_agent)) p
order by company

当然,在本例中,我们硬编码类型的值。可以将其设置为动态,以容纳未知数量的这些值。

Oracle版本:

WITH company (id, name) AS (
    SELECT 1, 'co1' FROM DUAL UNION ALL
    SELECT 2, 'co2' FROM DUAL UNION ALL
    SELECT 3, 'co3' FROM DUAL 
),
agent (id, name, company_id, type) AS (
    SELECT 1,  'Tom', 1, 'type1' FROM DUAL UNION ALL
    SELECT 2,  'Bob', 1, 'type2' FROM DUAL UNION ALL
    SELECT 3, 'Bill', 2, 'type1' FROM DUAL UNION ALL
    SELECT 4, 'Jack', 2, 'type2' FROM DUAL UNION ALL
    SELECT 5, 'John', 3, 'type1' FROM DUAL UNION ALL
    SELECT 6,  'Joe', 3, 'type2' FROM DUAL
)
SELECT
    company_name, type_1_agent, type_2_agent
FROM
    (SELECT company.name company_name, agent.name agent_name, type FROM company JOIN agent ON company.id = agent.company_id)
    PIVOT (
        MAX(agent_name) agent
        FOR type IN ('type1' type_1, 'type2' type_2)
    )
ORDER BY
    company_name
WITH company (id, name) AS (
    SELECT 1, 'co1' FROM DUAL UNION ALL
    SELECT 2, 'co2' FROM DUAL UNION ALL
    SELECT 3, 'co3' FROM DUAL 
),
agent (id, name, company_id, type) AS (
    SELECT 1,  'Tom', 1, 'type1' FROM DUAL UNION ALL
    SELECT 2,  'Bob', 1, 'type2' FROM DUAL UNION ALL
    SELECT 3, 'Bill', 2, 'type1' FROM DUAL UNION ALL
    SELECT 4, 'Jack', 2, 'type2' FROM DUAL UNION ALL
    SELECT 5, 'John', 3, 'type1' FROM DUAL UNION ALL
    SELECT 6,  'Joe', 3, 'type2' FROM DUAL
)
SELECT
    company_name, type_1_agent, type_2_agent
FROM
    (SELECT company.name company_name, agent.name agent_name, type FROM company JOIN agent ON company.id = agent.company_id)
    PIVOT (
        MAX(agent_name) agent
        FOR type IN ('type1' type_1, 'type2' type_2)
    )
ORDER BY
    company_name