簡體   English   中英

SQL無法弄清楚如何正確連接

[英]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

SQL小提琴演示

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

MySQL演示在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM