将多行组合成一行,其中只有一列中的数据发生更改,并将变量列的数据添加到行的末尾

时间:2013-02-20 13:16:13

标签: sql

我希望你能帮助我,因为我的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 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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'

答案 2 :(得分: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';

答案 3 :(得分:0)

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