2013-11-21 206 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