Leetcode1083. 銷售分析II(簡單)

Table: Product

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
| unit_price   | int     |
+--------------+---------+

product_id 是這張表的主鍵

Table: Sales

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| seller_id   | int     |
| product_id  | int     |
| buyer_id    | int     |
| sale_date   | date    |
| quantity    | int     |
| price       | int     |
+------ ------+---------+

這個表沒有主鍵衣撬,它可以有重復(fù)的行.
product_id 是 Product 表的外鍵.
編寫一個 SQL 查詢摩疑,查詢購買了 S8 手機(jī)卻沒有購買 iPhone 的買家。注意這里 S8 和 iPhone 是 Product 表中的產(chǎn)品嵌器。

查詢結(jié)果格式如下圖表示:
Product table:

+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+

Sales table:

+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 1          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 3        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+

Result table:

+-------------+
| buyer_id    |
+-------------+
| 1           |
+-------------+

id 為 1 的買家購買了一部 S8粗梭,但是卻沒有購買 iPhone并鸵,而 id 為 3 的買家卻同時購買了這 2 部手機(jī)。

解答
想法是創(chuàng)建購買了S8的臨時表 再創(chuàng)建沒有購買iphone的臨時表 兩表連接即可

先選出 S8 iphone的id

select product_id
from Product
where product_name = 'S8';

select product_id
from Product
where product_name = 'iPhone';

選出購買了S8的買家

select buyer_id
from Sales 
where product_id = (select product_id
from Product
where product_name = 'S8')

選出沒有購買iphone的id

select buyer_id
from Sales 
where product_id <> (select product_id
from Product
where product_name = 'iPhone')

兩表連接

SELECT tmp.buyer_id AS buyer_id
FROM (SELECT buyer_id
FROM Sales 
WHERE product_id = (SELECT product_id
FROM Product
WHERE product_name = 'S8')) tmp
JOIN (SELECT buyer_id
FROM Sales 
WHERE product_id <> (SELECT product_id
FROM Product
WHERE product_name = 'iPhone')) tmp2
ON tmp.buyer_id = tmp2.buyer_id

也可以轉(zhuǎn)為集合差的問題 從買了S8的集合中刪去買了iphone的集合

select A.buyer_id
from
(
    select distinct buyer_id
    from Product as P join Sales as S
        on(P.product_id = S.product_id and P.product_name ='S8')
) as A
left join
(
    select distinct buyer_id
    from Product as P join Sales as S
        on(P.product_id = S.product_id and P.product_name ='iPhone')
) as B
    on(A.buyer_id = B.buyer_id)
where B.buyer_id is NULL

別的解答
先做兩表連接

SELECT *
FROM Sales AS S LEFT JOIN Product AS P 
    ON(P.product_id = S.product_id)

對每個買家統(tǒng)計購買S8和Iphone的數(shù)量

SELECT SUM(IF(P.`product_name` = 'S8', 1, 0)), SUM(IF(P.`product_name` = 'iPhone', 1, 0)) 
FROM Sales AS S 
LEFT JOIN Product AS P 
ON(P.product_id = S.product_id)
GROUP BY S.`seller_id`

再選出購買S8的數(shù)量>0 而購買iPhone數(shù)量=0的買家id即可

SELECT S.`buyer_id`
FROM Sales AS S 
LEFT JOIN Product AS P 
ON(P.product_id = S.product_id)
GROUP BY S.`seller_id`
HAVING SUM(IF(P.`product_name` = 'S8', 1, 0)) > 0 AND  SUM(IF(P.`product_name` = 'iPhone', 1, 0)) = 0 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末富纸,一起剝皮案震驚了整個濱河市囤踩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晓褪,老刑警劉巖堵漱,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涣仿,居然都是意外死亡勤庐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門好港,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愉镰,“玉大人,你說我怎么就攤上這事钧汹≌商剑” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵拔莱,是天一觀的道長碗降。 經(jīng)常有香客問我,道長塘秦,這世上最難降的妖魔是什么讼渊? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嗤形,結(jié)果婚禮上精偿,老公的妹妹穿的比我還像新娘。我一直安慰自己赋兵,他們只是感情好笔咽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霹期,像睡著了一般叶组。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上历造,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天甩十,我揣著相機(jī)與錄音,去河邊找鬼吭产。 笑死侣监,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的臣淤。 我是一名探鬼主播橄霉,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邑蒋!你這毒婦竟也來了姓蜂?” 一聲冷哼從身側(cè)響起按厘,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钱慢,沒想到半個月后逮京,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡束莫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年懒棉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麦箍。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡漓藕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挟裂,到底是詐尸還是另有隱情享钞,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布诀蓉,位于F島的核電站栗竖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渠啤。R本人自食惡果不足惜狐肢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沥曹。 院中可真熱鬧份名,春花似錦、人聲如沸妓美。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壶栋。三九已至辰如,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贵试,已是汗流浹背琉兜。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毙玻,地道東北人豌蟋。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像桑滩,于是被迫代替她去往敵國和親夺饲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348