2013-02-20 53 views
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是什么。我很困难。请帮忙。

+2

你试过了什么?我们通常不会为您编写代码;你需要展示一些努力来试图找出答案。我会给你一个提示,并说你正在寻找使用pivot或CASE语句。但不知道您使用的是什么RDBMS,我们无法编写SQL。例如:http://stackoverflow.com/questions/12890467/split-rows-into-12-columns或http://stackoverflow.com/questions/13599404/rows-into-columns – xQbert 2013-02-20 13:19:47

回答

0

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

你的机会是: - 如果您使用的是专用的SQL RDBMS中,可能有一些旋转功能 - 如果你使用任何一种语言(如PHP,VBA)的创建查询 - 那么你可以创建它在查询可能的关系之后动态地进行。

+0

@xQbert:这正是什么我已经写过我的anser:pivot(专有)或使用动态创建的查询(取决于所使用的技术,它可能被称为不同;“动态SQL”,“字符串连接”,无论)。您在评论中是否重复我的回答? – fdreger 2013-02-20 15:49:18

+0

我对你的第一个说法感到困惑,除非它的固定列数不能完成,然后继续解释如何为可变数量的列完成。 OP没有对如何实现我所看到的预期结果施加任何限制;所以当我读到“不能完成”时,我不同意。 – xQbert 2013-02-20 18:53:31

+0

@xQbert:我只是说它不能在SQL中完成 - 而原因。这个问题被标记为“SQL”,没有提到特定的供应商或脚本语言。简单的“否”可能是我的答案的结束,但我觉得这并不完整,没有提醒我们在现实生活中,我们通常拥有比SQL更多的工具:就像用于生成SQL查询的某种环境(任何过程语言会做)。或者一些RDBMS扩展(如枢轴)。你还困惑吗?还有什么我可以解释的? – fdreger 2013-02-20 20:57:21

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' 
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'; 
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) 
相关问题