首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 面試題:兩張表關聯查詢統計每人購買總數(含無訂單用戶)

     編輯:程式設計綜合問答

題目描述

表 Person:Id_p, LastName
表 Orders:OrderNo, Id_p
需查詢:每個人的 Id_p, LastName, ItemCount(購買總數),無訂單顯示 0,LastName 為 null 顯示 'Unknown'。

標準解法:FULL JOIN + 聚合

SELECT 
    t.Id_p,
    t.LastName,
    COUNT(t.OrderNo) AS ItemCount
FROM (
    SELECT 
        o.OrderNo,
        ISNULL(o.Id_p, p.Id_p) AS Id_p,
        ISNULL(p.LastName, 'Unknown') AS LastName
    FROM Orders o
    FULL JOIN Person p ON o.Id_p = p.Id_p
) t
GROUP BY t.Id_p, t.LastName;

關鍵點解析

  1. FULL JOIN:保留兩張表所有行,無論是否匹配。MySQL 不支援,可用 LEFT JOIN UNION RIGHT JOIN 模擬。
  2. ISNULL/COALESCE:處理無訂單用戶的 Id_p 為 null,以及 LastName 為 null 的情況。
  3. 子查詢別名 t:先合併再聚合,邏輯清晰。

MySQL 兼容寫法

SELECT 
    t.Id_p,
    t.LastName,
    COUNT(t.OrderNo) AS ItemCount
FROM (
    SELECT o.OrderNo, o.Id_p, p.LastName
    FROM Orders o
    LEFT JOIN Person p ON o.Id_p = p.Id_p
    UNION
    SELECT o.OrderNo, o.Id_p, p.LastName
    FROM Orders o
    RIGHT JOIN Person p ON o.Id_p = p.Id_p
) t
GROUP BY t.Id_p, t.LastName;

結果示例

Id_pLastNameItemCount
1Wang3
2Unknown0
3Li2
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved