2016-03-07 112 views
0

我正在做一個SQL練習,並卡住了。如果我有數據庫架構在電腦商行http://sql-ex.ru/help/select13.php#db_1,問題描述爲:如何在此SQL練習中使用row_number和case語句?

重新編號,從產品表中的唯一雙{製造商,類型},已經責令他們如下:
- 製造商的名稱(製造商)在上升;
- 訂單中的產品類型(類型):PC,筆記本電腦,打印機。
如果製造商生產多種類型的產品,則僅在第一行中推出其名稱;
此製造商的其他行應包含一個空字符串('')。

我的查詢:

select 
    row_number() over (ORDER BY 
     maker ASC, 
     CASE type when 'PC' THEN 1 WHEN 'Laptop' THEN 2 WHEN 'Printer' THEN 3 END 
    ) num, 
    maker, type 
from product 
order by maker, CASE type when 'PC' THEN 1 WHEN 'Laptop' THEN 2 WHEN 'Printer' THEN 3 END 

我(不正確)答案:

+-----+-------+---------+ 
| num | maker | type | 
+-----+-------+---------+ 
| 1 | A  | PC  | 
| 10 | C  | Laptop | 
| 11 | D  | Printer | 
| 12 | D  | Printer | 
| 13 | E  | PC  | 
| 14 | E  | PC  | 
| 15 | E  | PC  | 
| 16 | E  | Printer | 
| 2 | A  | PC  | 
| 3 | A  | Laptop | 
| 4 | A  | Laptop | 
| 5 | A  | Printer | 
| 6 | A  | Printer | 
| 7 | A  | Printer | 
| 8 | B  | PC  | 
| 9 | B  | Laptop | 
+-----+-------+---------+ 

正確的答案是這樣的:

+-----+-------+---------+ 
| num | maker | type | 
+-----+-------+---------+ 
| 1 | A  | PC  | 
| 2 |  | Laptop | 
| 3 |  | Printer | 
| 4 | B  | PC  | 
| 5 |  | Laptop | 
| 6 | C  | Laptop | 
| 7 | D  | Printer | 
| 8 | E  | PC  | 
| 9 |  | Printer | 
+-----+-------+---------+ 

編輯

這是網站所說的在SQL支持方面使用的內容:Now we use Microsoft SQL Server 2012 on the rating stages, and MySQL 5.5.11, PostgreSQL 9.0, and Oracle Database 11g on the learn stage in addition.。這個問題來自學習階段。

+0

您似乎有比正確的答案更多的行,爲什麼? – Blorgbeard

+0

您標記了'mysql' - 您的意思是'sql server'或其他支持分析函數的數據庫嗎? – sgeddes

+0

謝謝,我刪除了標籤。這就是該網站所說的SQL支持:「現在我們在評級階段使用Microsoft SQL Server 2012,另外在學習階段使用MySQL 5.5.11,PostgreSQL 9.0和Oracle Database 11g。 '。這個問題來自學習階段。 – Nona

回答

1

下面的查詢將得到所需要的輸出MySQL的:

select rank, manufacturer, type 
from (
    select @r:[email protected]+1 AS rank, 
    if(@lastmaker = maker, '', maker) as manufacturer, 
    type, @lastmaker := maker 
    from product, (SELECT @r:=0, @lastmaker:='') r 
    order by maker, type 
) mytable; 

這裏是SQL Fiddle例如。

+0

在練習網站的窗口中,我收到一條消息:'必須聲明標量變量「@r」。「 - 我如何在該聲明中執行此操作? – Nona

+0

你指的是哪個鍛鍊網站? –

+0

http://sql-ex.ru/ – Nona