2013-11-21 210 views
-1

这些都是创建的表,我有工作:SQL SELECT查询语句

create table Customer2 (
    cid char(3), cname char(10), primary key (Cid) 
); 
create table Employee2 (
    eid char(3), ename char(10), salary number(7,2), mid char(3),primary key (eid), foreign key (mid) references Employee2 
); 
create table ArtObject2 (
    aoid char(3), atitle char(12), artist varchar(10), pricea number(8,2), primary key (aoid) 
); 
create table MakesD2 (
    aoid char(3), eid char(3), cid char(3), prices number, dates date, primary key (aoid,CID), foreign key (aoid) references ArtObject2, foreign key (CID) references Customer2, foreign key (eid) references Employee2 
); 

我需要写下面的SQL语句:

  1. 名单的客户谁没有购买任何名称绘画与要价 高于$ 500,000.00
  2. 找到谁买了最高数量的画的客户的名字
  3. 对于每一幅画ld显示该画的标题,由顾客支付的价格 以及如果以高于平均要价的价格出售的绘画以及如果绘画出售在绘画上的话“低于平均” 价格低于平均要价。对于持有“要求高于 ”或“低于要求”等字的列制作标题备注。

我想这种说法对#1,但没有结果过多:

select cname from customer2 
where cid in (select cid from makesd2 
    where aoid in (select aoid from artobject2 
      where pricea <= '500000')); 

我想这个语句#2,但没有返回结果:

select c.cname from customer2 c 
inner join(select cid, count(*) as bought 
    from makesd2 
    group by cid m on m.cid = c.cid 
    order by m.bought; 

我试着这个声明为#3和它的工作,它只是错过了应该是'春'的第一个结果:

select a.atitle, m.prices, 'Higher than average' as "Price" from artobject2 a 
    join makesd2 m on 
    a.aoid = m.aoid 
    and a.pricea > (select avg(pricea) from artobject2) 
union 
select a.atitle, m.prices, 'Lower than average' as "Price" from artobject2 a 
    join makesd2 m on 
    a.aoid = m.aoid 
    and a.pricea <= (select avg(pricea) from artobject2); 
+0

没有冒犯,但我们都可以同意这个标题是可怕的吗?当然,我不知道如何解决它。 –

+0

更改为“请为我完成作业。” – catfood

+0

敌人#3,你说过“如果这幅画的价格比平均要价贵”。整个ArtObject2表的平均价格是多少? – Shiva

回答

0

在线演示这里所有的3个查询=>http://sqlfiddle.com/#!3/5b3b9/6 如果你用你的数据填充小提琴的左侧部分,你可以在那里看到结果!

以下是有解释的SQL语句。

SQL查询#1

SELECT C.* 
FROM Customer2 C 
LEFT JOIN MakesD2 M ON C.cid = M.cid 
INNER JOIN ArtObject2 A ON A.aoid = M.aoid 
WHERE A.pricea >= 500000 
AND M.cid IS NULL 

的#1的Sql说明:您做了留下MakesD2 JOIN所以从顾客2返回所有的客户,如果他们没有销售,那么在MakesD2的CID将是空的条件pricea在ArtObject2是超过50万

SQL查询#2

SELECT c.cname AS 'Customer Name', COUNT(*) AS 'Purchases' 
FROM Customer2 C 
INNER JOIN MakesD2 M ON C.cid = M.cid 
INNER JOIN ArtObject2 A ON A.aoid = M.aoid 
GROUP BY c.cname ORDER BY 2 DESC; 

#2的说明Sql你做内部加入(即, EQUI JOIN)在客户,2 MakesD2和ArtObject2以及GROUP BY Cname之间进行计算并计算COUNT(*),这将成为购买数量,然后对其进行订购,因此大部分采购将在TOP上进行。如果您只想要前5名,请在SQL SELECT中使用SELECT TOP 5

SQL查询中的变量#3的Sql店的平均价格#3

DECLARE @AveragePrice NUMERIC(8,2) 
SELECT @AveragePrice = AVG(pricea) FROM artobject2 

SELECT A.atitle AS 'Title', m.prices AS 'Price Paid', 
CASE WHEN (m.Prices > @AveragePrice) 
    THEN 'Higher than average' 
    WHEN (m.Prices < @AveragePrice) 
    THEN 'Lower than average' 
    ELSE 'At Average' 
    END AS 'Remarks' 
FROM MakesD2 M 
INNER JOIN ArtObject2 A ON A.aoid = M.aoid; 

解释,然后用它在一个CASE switch语句弄清楚,如果销售价格高于或低于平均水平。

+0

M.cid应该不为空,我相信。 – Gayathri

+0

@Gayathri号M.cid not null记录将是那些已经购买了500,000以上艺术品的客户。所以否定这将会给那些没有购买超过500,000的顾客。 – Shiva

0

为#3(MySQL的)SQL查询:

SELECT @AVGPRICE := AVG(pricea) FROM artobject2; 

SELECT a.atitle, 
     m.prices, 
     IF (a.pricea > @AVGPRICE, 'Higher than average', 'Lower than average') AS Remark 
FROM artobject2 AS a JOIN makesd2 AS m USING (aoid); 

首先你计算从artobject2的平均价格,并将其保存在一个局部变量。

虽然我不太确定这是你想要的。也许你最好提供一些测试数据。例如:

001 Drinker, by Teomondo Scrofalo 
002 La Gioconda, by Leonardo da Vinci 

001 250 
001 300 
001 350 
002 1000000000 
002 1200000000 
002 1400000000 

“平均价格”从投标表某处大约5亿欧元。因此,绘制001将总是低于平均水平,绘画002将总是高于平均水平。

一种不同的方法和不同的结果:

SELECT a.atitle, 
     m.prices, 
     IF (a.pricea > averag, 'Higher than average', 'Lower than average') AS Remark 
FROM artobject2 AS a JOIN makesd2 AS m USING (aoid) 
JOIN (SELECT aoid, AVG(pricea) AS averag GROUP BY aoid) AS averages USING (aoid); 

现在内部表会产生

001 300 
002 1200000000 

,你会得到

001 250 Lower 
001 300 Lower -- Note: this is because "equal" is considered "lower" 
001 350 Higher 
002 1000000000 Lower 
002 1200000000 Lower 
002 1400000000 Higher 

你甚至可以在复杂的事情:

SELECT a.atitle, 
     m.prices, 
     CASE 
      WHEN a.pricea < averag*0.95 THEN 'Lower than average' 
      WHEN a.pricea > averag/0.95 THEN 'Higher than average' 
      ELSE CONCAT('About average of ', averag) 
     END AS Remark 
FROM artobject2 AS a JOIN makesd2 AS m USING (aoid) 
JOIN (SELECT aoid, AVG(pricea) AS averag GROUP BY aoid) AS averages USING (aoid); 

001 250  Lower than average 
001 300  About average of 300 
001 350  Higher than average 
002 1000000000 Lower than average 
002 1200000000 About average of 1200000000 
002 1400000000 Higher than average