将多行组合成一行,其中只有一列中的数据发生更改,并将不同列的数据添加到行尾
我希望你能帮助我,因为我的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是什么。我很困难。请帮忙。
除非有一个固定的静态关系数,从一开始就知道,那么答案是:NO。您不能进行返回可变数量列的SQL查询。
你的机会是: - 如果您使用的是专用的SQL RDBMS中,可能有一些旋转功能 - 如果你使用任何一种语言(如PHP,VBA)的创建查询 - 那么你可以创建它在查询可能的关系之后动态地进行。
@xQbert:这正是什么我已经写过我的anser:pivot(专有)或使用动态创建的查询(取决于所使用的技术,它可能被称为不同;“动态SQL”,“字符串连接”,无论)。您在评论中是否重复我的回答? – fdreger 2013-02-20 15:49:18
我对你的第一个说法感到困惑,除非它的固定列数不能完成,然后继续解释如何为可变数量的列完成。 OP没有对如何实现我所看到的预期结果施加任何限制;所以当我读到“不能完成”时,我不同意。 – xQbert 2013-02-20 18:53:31
@xQbert:我只是说它不能在SQL中完成 - 而原因。这个问题被标记为“SQL”,没有提到特定的供应商或脚本语言。简单的“否”可能是我的答案的结束,但我觉得这并不完整,没有提醒我们在现实生活中,我们通常拥有比SQL更多的工具:就像用于生成SQL查询的某种环境(任何过程语言会做)。或者一些RDBMS扩展(如枢轴)。你还困惑吗?还有什么我可以解释的? – fdreger 2013-02-20 20:57:21
这是假定每个策略编号都有一个角色,并且您需要显示的唯一角色就是这三个角色。
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'
尝试此查询
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';
首先,你的答案依赖于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)
你试过了什么?我们通常不会为您编写代码;你需要展示一些努力来试图找出答案。我会给你一个提示,并说你正在寻找使用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