[英]SQL can't figure out how to join correctly
有加盟問題
我有一個表,其中有一個ID和description列,這些季節是新的,但是描述會重復。 因此我們可以有第34季的成人價格和第35季的成人價格等。
select * from tableA
-- returns id, description, price, season etc ...
-- 1 "GT Adult" 10 34
-- 2 "GT Child" 5 34
-- 3 "GT Senior" 8 34
-- 1 "GT Adult" 11 35
-- 2 "GT Child" 6 35
-- etc.
TableB具有多個列,這些列具有與描述列相對應的名稱/標題。
select * from tableB
-- returns customer_no adult, child, senior, order_dt, order_data, season, perf_no etc.
-- returns 112 0, 12, 2, order_dt, order_data, order_season.
-- returns 415 23, 0, 0, order_dt, order_data, order_season.
基本上,每個客戶都訂購給定數量的每種類型的門票。 我們可以用來加入的信息是他們匹配的賽季和表現...
但我不知道該如何對客戶112說,因為他得到了12張兒童票,應該向他收取5張票,為2張高級票,應該為每張票收取8美元。 作為客戶415,應為23張門票中的每張收費10美元。 按季節。
我唯一可以確定的是按季節加入,但如何加入正確的專欄。 請指教。
我認為您無法用自己的桌子做您想做的事。 沒有明確的方法將表B中的“成人”列與包含表A中的“ GT成人”的行相關聯。
您可以重新設計TableB來解決此問題:
TableB (customer_no, ticket_type, quantity, order_dt, ...)
因此,對於客戶112,我們將在TableB中擁有:
112, "GT_Child", 12 ...
112, "GT_Senior", 2 ...
因此,您可以通過加入ticket_type(如果需要,還可以添加其他列)來回答您的查詢。
如果可能的話,您應該將訂單本身的詳細信息移到第三張表中(我們稱之為TableC)並分配一個訂單號。 這樣,我們現在就可以擁有TableA了,然后:
TableB (order_no, customer_no, ticket_type, quantity)
TableC (order_no, order_dt, season ...)
您可以使用PIVOT
來獲取每個季節一行中的所有票價:
SELECT season, [GT Adult], [GT Child], [GT Senior]
FROM (
SELECT season, price, [description]
FROM tableA
) source
PIVOT (
MAX(price)
FOR [description] IN ([GT Adult], [GT Child], [GT Senior])
) pvt
給定OP中引用的樣本數據,以上代碼會產生如下結果:
season GT Adult GT Child GT Senior
-----------------------------------------
34 10 5 8
35 11 6 NULL
然后,您可以執行簡單的INNER JOIN
操作以獲得每個客戶訂單的總金額:
SELECT customer_no, adult * [GT Adult] + child * [GT Child] + senior * [GT Senior] AS total
FROM tableB AS B
INNER JOIN (
SELECT season, [GT Adult], [GT Child], [GT Senior]
FROM (
SELECT season, price, [description]
FROM tableA) source
PIVOT (
MAX(price)
FOR [description] IN ([GT Adult], [GT Child], [GT Senior])
) pvt
) t ON b.season = t.season
PS上述查詢在SQL Server中有效。
編輯:
為了在MySQL
模擬PIVOT
,我們必須使用條件聚合:
select season,
sum(if(description='GT Adult', price ,null)) as adultPrice,
sum(if(description='GT Child', price ,null)) as childPrice,
sum(if(description='GT Senior', price ,null)) as seniorPrice
from tableA
group by season;
上面的查詢為我們提供了可以執行JOIN
操作的結果集:
SELECT customer_no, adult * adultPrice + child * childPrice + senior * seniorPrice AS total
FROM tableB AS b
INNER JOIN (
SELECT season,
SUM(IF(description='GT Adult', price ,null)) AS adultPrice,
SUM(IF(description='GT Child', price ,null)) AS childPrice,
SUM(IF(description='GT Senior', price ,null)) AS seniorPrice
FROM tableA
GROUP BY season) AS a ON b.season = a.season
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.