2013-01-02 255 views
2

有几个表中的DB:SQL聚合函数

Product(maker, model, type) 
PC(code, model, speed, ram, hd, cd, price) 
Laptop(code, model, speed, ram, hd, price, screen) 
Printer(code, model, color, type, price) 

,我需要找到

查找产品(PC,笔记本电脑或打印机)具有最高的性价比的型号。 结果集:模型。

我设法编写以下查询:

select model from 
(select model, price from PC 
union 
select model, price from Laptop 
union 
select model, price from Printer) G 

,现在我需要绘制模型/从集合G车型,至极有一个最大的价格

我可以很容易地通过选择一个最高价添加到选择子句 - 最大(G.price), ,但我需要模型和只有模型...

什么语法将是正确的?

谢谢你提前!

+1

您确定要使用' UNION'而不是'UNION ALL'? – Kermit

+0

这是什么SQL产品? – RBarryYoung

+0

它只是一个标准的SQL,pl/sql也可以使用 – tania

回答

1

仅限最高价格?

select model 
from 
(select 
    model, 
    rank() over (order by max(price) desc) as [rank] 
from 
    (select model, price from PC 
    union 
    select model, price from Laptop 
    union 
    select model, price from Printer) u 
    group by model) g 
where g.rank = 1 

对不起,但我目前无法测试是否可以在rank()中使用MAX()。如果不是,请添加另一个子查询。首先确定最大值(价格),然后确定等级。

所以,MAX()排名的()内的工作...... 的替代,用一个简单的语法:

select top 1 with ties 
    g.model 
from 
(select 
    u.model, 
    max(u.price) as [maxPrice] 
from 
    (select model, price from PC 
    union 
    select model, price from Laptop 
    union 
    select model, price from Printer) u 
    group by model) g 
order by g.maxPrice desc 
  • 编辑1:增加了 '顶部1',因为只有一个记录预计
  • 编辑2:删除'top 1',添加排名
  • 编辑3:使用sqlfiddle后删除'按型号分区'。感谢@bluefeet!
  • 编辑4:添加替代'与领带'。再次感谢@bluefeet。
+0

它返回数据库中的所有模型...不只是一个具有最高的价格 – tania

+0

对不起,认为你需要所有最高的价格,我会添加'顶部1'。 – Jacco

+0

与一个最高的价格:)可能有模型之间的联系,所以可能会有一个到多个回报,但以相同的(一个)最高价格... – tania

0

大厦Jacco的回答,

select model 
from 
(select model, max(price) as maxPrice 
from 
    (select model, price from PC 
    union 
    select model, price from Laptop 
    union 
    select model, price from Printer) u 
    group by model) g 
where maxPrice = max(maxPrice) 

变化限制1,而不是MySQL的。

+0

这个问题..我们不知道有多少模型有同样的价格... – tania

+0

会上面编辑的代码工作? – DNadel

+0

不是真的......聚合可能不会出现在WHERE子句中,除非它位于包含在HAVING子句或选择列表中的子查询中,而聚合的列是外部引用 – tania

0
SELECT 
    model 
FROM 
    (
    SELECT model, price, ROW_NUMBER() OVER(ORDER BY price DESC) AS seq FROM PC 
    UNION 
    SELECT model, price, ROW_NUMBER() OVER(ORDER BY price DESC) AS seq FROM Laptop 
    UNION 
    SELECT model, price, ROW_NUMBER() OVER(ORDER BY price DESC) AS seq FROM Printer 
) final 
WHERE 
    seq = 1 
+0

dont'很明白你在做什么此查询返回每种类型中的最高价格,例如打印机价格最高的型号,笔记本电脑和PC最高价格的型号, – tania

+0

,并且应该返回一个型号/多个型号,并且价格最高(只有一个价格是最高)在整个数据库中,0 – tania

+0

@tania - 如果这是你想要做的,那么为什么没有Ulises回答你的工作? – 2013-01-02 20:19:08

1

这里是解决方案的工作..

SELECT模型 从PC WHERE价> = ALL(SELECT MAX(价格)从PC UNION SELECT MAX(价格)FROM膝上型UNION SELECT MAX(价格)FROM打印机)

UNION

SELECT模型 FROM膝上型 WHERE价> = ALL(SELECT MAX(价格)从PC UNION SELECT MAX(价格)FROM膝上型UNION SELECT MAX(价格)FROM打印机)

UNION

SELECT model FROM printer WHERE price> = ALL(SELECT MAX(price)FROM pc UNION SELECT MAX(price)FROM laptop UNION SELECT MAX(price)FROM printer)

+0

是的,这个工作。每次出现“UNION ALL”代替“UNION”时效率更高。另外,由于'> = ALL',所以在子查询中不需要'MAX'。 –