我希望你能帮助我,因为我的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的内容。我真的被卡住了。请帮忙。
答案 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)