0

我希望你能帮助我,因为我的 sql 非常基础。以下是我的查询:

我的数据如下所示:

Policy Number | Commission Amount | Relationship | PersonLinked
50422         | 1000.00           | Owner        | John Smith
50422         | 1000.00           | Advisor      | Richard Bass
50422         | 1000.00           | Port Man     | Craig Thomson
74857         | 500.00            | Owner        | Karen Jones
98765         | 20000.00          | Owner        | Tim Crosby
98765         | 20000.00          | Port Man     | Josh Bishop

但我想在一行中显示所有数据,所以它看起来像这样:

Policy Number | Commission Amount | Owner          | Advisor        | Port Man
50422         | 1000.00           | John Smith     | Richard Bass   | Craig Thomson
74857         | 500.00            | Karen Jones    |                |
98765         | 20000.00          | Tim Crosby     |                | Josh Bishop

如果可以以这种方式操作数据,请告诉我 SQL 是什么。我真的被困住了。请帮忙。

4

4 回答 4

0

除非从一开始就知道有固定的、静态数量的关系,否则答案是:不。您不能进行返回可变列数的 SQL 查询。

您的机会是: - 如果您使用专有的 SQL rdbms,可能会有一些旋转功能 - 如果您使用任何类型的语言(如 PHP、VBA)来创建查询 - 那么您可以动态创建它,之后查询可能的关系。

于 2013-02-20T13:21:15.790 回答
0

首先,您的答案取决于您未指定的 SQL 版本。每个版本中都有允许您连接的功能。值,例如将表数据转换为字符串。在 Oracle - LISTAGG()、MY SQL - GROUP_CONCAT() 等... 除非您为每个案例创建视图或表,否则无法在 SQL 中创建动态列。您可以创建表作为选择您需要的所有列并从 your_table 添加更多列,您还可以创建具有不同列数的视图。您需要在您的 SQL 版本中对此进行研究。所有带有 CASE 表达式的示例都很好,但我会进行研究,看看您的 SQL 版本中有什么可用的,因为 LISTAGG() 或 GROUP_CONCAT() 是您真正想要的,而不是 CASE。这是创建“动态”列的 Oracle 示例。

CREATE TABLE test_tab AS
 SELECT empno
      , ename
      , ename "OWNER" -- This column name is OWNER and datatype is the same as ename 
  FROM scott.emp
 WHERE 1=2 -- False - empty table is created, no data...
/

-- Describe newly created table:

SQL> desc test_tab  

Column Name  Data Type 
--------------------------------
EMPNO    NUMBER (4)              
ENAME    VARCHAR2 (10 Byte)        
OWNER    VARCHAR2 (10 Byte) 
于 2013-02-20T13:38:30.627 回答
0

这是假设您在每个保单编号中都有一个角色,并且您需要显示的唯一角色是这三个角色。

Select [own].[Policy Number], 
       [own].[Commission Amount],
       [own].[PersonLinked] as [Owner],
       [adv].[PersonLinked] as [Advisor],
       [port].[PersonLinked] as [Port Man]
From   PolicyRoles as [own]
Join   PolicyRoles as [adv] on [own].[Policy Number] = [adv].[Policy Number]
                            and [adv].[Relationship] = 'Advisor'
Join   PolicyRoles as [port] on [own].[Policy Number] = [port].[Policy Number]
                             and [port].[Relationship] = 'Port Man'
Where  [own].[Relationship] = 'Owner'
于 2013-02-20T13:23:15.970 回答
0

试试这个查询

Select a.Policy Number, a.Commission Amount, a.PersonLinked as 'Owner', b.PersonLinked 'Advisor', c.PersonLinked as 'Port Man' 
FROM tbl a, tbl b, tbl c
WHERE a.Policy Number = b.Policy Number AND a.Policy Number = c.Policy Number AND
b.Policy Number = c.Policy Number AND a.Relationship = 'Owner' AND 
b.Relationship = 'Advisor' AND c.Relationship = 'Port Man';
于 2013-02-20T13:24:05.360 回答