我的数据库看起来如下
**Customer Order Product**
cid(PK) oid(PK) pid(PK)
fname cid(FK) pname
lname pid(FK) pprice
现在我使用查询获得以下结果:
**fname lname oid pname pprice**
Bill Gates 1111 Router 40,-
Bill Gates 1112 Laptop 699,-
Steve Jobs 1113 Tablet 1299,-
Steve Jobs 1114 Watch 699,-
但我想要的是,如果此人拥有多个订单,则仅列出名字和姓氏一次。我怎么能做到这一点?
预期输出示例:
**fname lname oid pname pprice**
Bill Gates 1111 Router 40,-
1112 Laptop 699,-
Steve Jobs 1113 Tablet 1299,-
1114 Watch 699,-
答案 0 :(得分:0)
在查询中使用ROW_NUMBER()(由fname分区,Lname Order By Oid)作为RN对行进行编号。然后在外部查询或下一个查询中,如果将结果转储到临时表,则在RN不为1时使用case语句将fname和lname设置为空字符串。
您需要额外的列,例如客户编号,以便按CustomerNo,RN,Lname,Fname
订购答案 1 :(得分:0)
使用LAG
功能可以解决此问题
LAG
函数返回上一行中给定列的值
然后我们可以将前一行的这个值与当前行的值进行比较。
我们可以使用CASE
语句返回值,具体取决于此比较的结果。
这是一个给出所需结果的查询:
SELECT
CASE
WHEN lag(concat(cop.fname, cop.lname), 1, 0) OVER (order by cop.oid) = concat(cop.fname, cop.lname) THEN null
ELSE cop.fname
END AS fname,
CASE
WHEN lag(concat(cop.fname, cop.lname), 1, 0) OVER (order by cop.oid) = concat(cop.fname, cop.lname) THEN null
ELSE cop.lname
END AS lname,
cop.oid,
cop.pname,
cop.pprice
FROM
(SELECT c.fname, c.lname, o.oid, p.pname, p.pprice
FROM customer c
LEFT JOIN myorder o on c.cid=o.cid
LEFT JOIN product p on o.pid=p.pid) cop
选择ORDER
作为表名称并不是一个好主意,因为ORDER
是SQL
中的关键字。所以我选择MYORDER
作为包含订单的表的名称
以上查询适用于Oracle
数据库