2017-09-18 114 views
0

我正在爲學校分配工作,而我有點卡住了。我們正在研究子查詢。但我不確定在這裏需要一個人。我並不是在尋找完整的答案,而是想到正確的思路。是這裏需要的子查詢SQL

這裏是問題:

編寫返回具有 獨特的折扣百分比每個品牌的名稱和折扣百分比的SELECT語句。換句話說,不要包含與 其他品牌具有相同折扣百分比的品牌。 按品牌名稱列排序結果。

我知道我需要從品牌表中返回BrandName和BrandDiscountPercentage,但是這裏是否需要子查詢?爲什麼我不能只使用DISTINCT關鍵字。我相當新的SQL,所以我仍然在學習,但我不知道爲什麼在這裏需要子查詢。

再次,不尋找完整的答案,但如果你必須提供完整的解決方案,請至少解釋一點,以便我可以從中學習。

+0

可以顯示錶結構,樣本數據和預期的結果? –

+0

如果沒有表結構和關係 – Eric

+0

請不要發送垃圾郵件無關標籤 - MySql和SQL Server 2016是完全不同的東西,您的任務不需要(也可能不需要)需要RDBMS特定的功能。 – Filburt

回答

0

您可以使用子查詢或自連接來實現此目的。

  1. 您可以選擇只是在一個子查詢的不同折扣百分比,然後獲取相應的品牌

    SELECT名優產品,DIS_PERCENT FROM MyTable的 WHERE(1 DIS_PERCENT)在(SELECT COUNT() ,DIS_PERCENT FROM MyTable的 GROUP BY DIS_PERCENT HAVING計數()= 1)

  2. ,或者可以是corelated子查詢

    SELECT聚力行,DIS_PERCENT FROM MyTable的米 WHERE 1 =

  3. 或用一個自連接

    SELECT m.BRANDNAME(SELECT從MYTABLE其中DIS_PERCENT = m.DIS_PERCENT COUNT(*)) ,m.DIS_PERCENT FROM MyTable的米,MYTABLE M1 WHERE m.rowid <> m1.rowid AND m.dis_percent <> m1.dis_percent

  4. 從表 中選擇不同的名稱,Discount_percent這不會在這裏工作,因爲它會給品牌和百分比的獨特組合。 「您的要求不會被滿足」不包括與另一品牌具有相同折扣百分比的品牌。「

0

DISTINCT是不正確的做法,因爲它返回的數據一旦所有的價值觀 - 即使他們重複。

但是,您實際上並不需要子查詢。聚合查詢實際上有效:

select max(b.BrandName), BrandDiscountPercentage 
from brands b 
group by BrandDiscountPercentage 
having min(b.BrandName) = max(b.BrandName); 

這確定了是否有任何給定百分比的名稱不止一個。如果min()max()是相同的,那麼只有一個值。 Max(b.BrandName)返回該唯一值。

等效having條款是:

having count(distinct b.BrandName) = 1 
1

一個做到這一點的方法是group byBrandDiscountPercentage,然後篩選出重複值。顯示這個最簡單的方法是通過步驟。

選擇所有查詢:

select 
    BrandName, 
    BrandDiscountPercentage 
from Brands 

結果:

BrandName BrandDiscountPercentage 
A   1  
B   2 
C   3 
D   2 

集團通過BrandDiscountPercentage查詢:

select BrandDiscountPercentage, count(*) 
from Brands 
group by BrandDiscountPercentage 

結果:

BrandDiscountPercentage  count(*) 
1       1 
2       2 
3       1 

過濾掉非唯一BrandDiscountPercentage查詢:

select BrandDiscountPercentage, count(*) 
from Brands 
group by BrandDiscountPercentage 
having count(*) = 1 

結果:

BrandDiscountPercentage  count(*) 
1       1 
3       1 

包括:通過使用聚合函數查詢的名優產品:

select min(BrandName), BrandDiscountPercentage 
from brands 
group by BrandDiscountPercentage 
having count(*) = 1 
order by min(BrandName) 

結果:

BrandName BrandDiscountPercentage 
A   1  
C   3