2015-01-21 19 views
1

我的DB看起来其次SQL上市的组合只有一次

**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,- 
+1

这不是一个sql任务。在您的报告中执行或将空白值填入NULL。 – 2015-01-21 10:09:58

回答

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数据库

0

使用ROW_NUMBER()以上(分区由FNAME,LNAME顺序按OID)为RN在查询中显示行号。然后在您的外部查询或您的下一个查询中,如果将结果转储到临时表,则使用case语句在RN不为1时将fname和lname设置为空字符串。

您需要一个额外的列,例如Customer No订购,以便您可以通过CustomerNo,RN,Lname,Fname订购