客户
╔═══════╦══════════╗
║ CUSID ║ CUS NAME ║
╠═══════╬══════════╣
║ 1 ║ AA ║
║ 2 ║ BB ║
║ 3 ║ CC ║
╚═══════╩══════════╝CusSeaFood
╔════╦═══════╦══════════╗
║ ID ║ CUSID ║ NAME ║
╠════╬═══════╬══════════╣
║ 1 ║ 1 ║ SeaFoodA ║
║ 2 ║ 1 ║ SeaFoodB ║
║ 3 ║ 2 ║ SeaFoodC ║
╚════╩═══════╩══════════╝CusPizza
╔════╦═══════╦══════╗
║ ID ║ CUSID ║ NAME ║
╠════╬═══════╬══════╣
║ 1 ║ 1 ║ PAA ║
║ 2 ║ 2 ║ PBB ║
╚════╩═══════╩══════╝CusSnack
╔════╦═══════╦══════╗
║ ID ║ CUSID ║ NAME ║
╠════╬═══════╬══════╣
║ 1 ║ 2 ║ SAA ║
║ 2 ║ 3 ║ SBB ║
╚════╩═══════╩══════╝想要数多少海鲜,比萨饼或零食是订购的客户的例子如下。
Cus ID, Cus Name, Number Of SeaFood, Sea Food info, Number Of Pizza, Pizza info, Number of Snack, Snack info.顾客可能不会订购所有三种类型的食物。
发布于 2013-03-07 07:20:47
您需要通过子查询单独计算每个计数,以便获得正确的结果。这将阻止您计算重复记录。
SELECT a.*,
COALESCE(b.totalSeaFood, 0) totalSeaFood,
COALESCE(c.totalPizza, 0) totalPizza,
COALESCE(d.totalSnack, 0) totalSnack
FROM Customer a
LEFT JOIN
(
SELECT cusID, COUNT(*) totalSeaFood
FROM CusSeaFood
GROUP BY cusID
) b ON a.cusID = b.CusID
LEFT JOIN
(
SELECT cusID, COUNT(*) totalPizza
FROM CusPizza
GROUP BY cusID
) c ON a.cusID = c.CusID
LEFT JOIN
(
SELECT cusID, COUNT(*) totalSnack
FROM CusSnack
GROUP BY cusID
) d ON a.cusID = d.CusID若要获得更多关于联接的知识,请访问以下链接:
结果
╔═══════╦══════════╦══════════════╦════════════╦════════════╗
║ CUSID ║ CUS NAME ║ TOTALSEAFOOD ║ TOTALPIZZA ║ TOTALSNACK ║
╠═══════╬══════════╬══════════════╬════════════╬════════════╣
║ 1 ║ AA ║ 2 ║ 1 ║ 0 ║
║ 2 ║ BB ║ 1 ║ 1 ║ 1 ║
║ 3 ║ CC ║ 0 ║ 0 ║ 1 ║
╚═══════╩══════════╩══════════════╩════════════╩════════════╝发布于 2013-03-07 07:21:54
在你的例子中,“海食信息”、“比萨信息”等等对我来说是没有意义的。如果顾客点了一份以上的海鲜或比萨饼,这里应该怎么表示呢?
通常,你会期望看到多行,每个订购的东西一行。为了获得这个信息,你甚至不需要一个连接,只需要一个UNION。
SELECT * FROM CusSeaFood WHERE CusID = ?
UNION SELECT * FROM CusPizza WHERE CusID = ?
UNION SELECT * FROM CusSnack WHERE CusID = ?https://stackoverflow.com/questions/15265251
复制相似问题