首页 > 解决方案 > 比较两个表或查询和表

问题描述

我有一张这样的桌子:

cp_store  name    qty
"Cp1"   "pesto" "1.0"
"Cp1"   "jivara"    "1.0"
"Cp1"   "Nocciola"  "1.0"
"Cp1"   "Parfait"   "1.0"
"Cp1"   "Crema" "1.0"
"Cp1"   "Crema" "1.0"
"Cp1"   "Malaga"    "1.0"
"Cp1"   "Ricotta_Limone"    "1.0"
"Cp1"   "Ricotta_Limone"    "1.0"
"Cp1"   "Ricotta_Limone"    "1.0"
"Cp1"   "mango" "1.0"
"Cp1"   "Lampone"   "1.0"
"Cp1"   "Limone_zenzero"    "1.0"
"Cp1"   "Limone_zenzero"    "1.0"
"Cp1"   "Limone_zenzero"    "1.0"
"Cp1"   "Limone_zenzero"    "1.0"
"Cp1"   "Pistacchio"    "1.0"
"Cp1"   "Caramello_Salato"  "1.0"
"Cp1"   "albicocca" "1.0"
"Cp1"   "Pistacchio"    "1.0"
"Cp1"   "Pistacchio"    "1.0"
"Cp1"   "Pistacchio"    "1.0"
"Cp1"   "Cioccolato"    "1.0"
"Cp1"   "Cioccolato"    "1.0"
"Cp1"   "Cioccolato"    "1.0"
"Cp1"   "Bacio_Siculo"  "1.0"
"Cp1"   "Bacio_Siculo"  "1.0"
"Cp1"   "Bacio_Siculo"  "1.0"
"Cp1"   "Cioccolato_al_rum" "1.0"
"Cp1"   "Cioccolato"    "1.0"
"Cp1"   "Cioccolato"    "1.0"
"Cp1"   "Cioccolato"    "1.0"
"nice1" "Cioccolato"    "1.0"
"nice1" "Cioccolato"    "1.0"
"nice1" "Cioccolato"    "1.0"
"nice1" "Bacio_Siculo"  "1.0"
"nice1" "Bacio_Siculo"  "1.0"
"nice1" "Bacio_Siculo"  "1.0"
"nice1" "Cioccolato_al_rum" "1.0"
"nice1" "Cioccolato_al_rum" "1.0"

我使用这个查询

SELECT cp_store, nome, SUM(CAST(qta AS DECIMAL(10, 1))) AS total 
FROM tb_store 
WHERE  data_out is null 
GROUP BY cp_store, nome 
ORDER BY cp_store, nome

获得这个:

cp_store  name    qty
 "Cp1"  "Cioccolato"    "6.0"
 "Cp1"  "Cioccolato_al_rum" "1.0"
 "Cp1"   "Bacio_Siculo"  "3.0"
 "nice1"  "Cioccolato_al_rum" "2.0"
 "nice1"  "Bacio_Siculo"  "3.0"
.
.
.

但我想将结果名称与此表进行比较:

id name        presence cp_store 
1 "Cioccolato"  "1" "All" 
2 "Bacio_Siculo"    "1" "All" 
3 "Ricotta_Limone"  "1" "All" 
4 "Cioccolato_al_rum"   "1" "All" 
5 "Pistacchio"  "1" "All" 
6 "Nocciola"    "1" "nice1" 
7 "Mascarpone"  "1" "Cp1"
8 "Limone"  "0" "Cp1"

. . .

如果名称存在且cp_store等于 ALL ,但在第一次查询的结果中未找到,则最终结果 qty 为 0,如下所示:

cp_store    name                 qty
 "Cp1"      "Cioccolato"        "6.0"
 "Cp1"      "Cioccolato_al_rum" "1.0"
 "Cp1"      "Bacio_Siculo"      "3.0"
 "nice1"    "Cioccolato_al_rum" "2.0"
 "nice1"    "Bacio_Siculo"      "3.0"
 "All"      "Pistacchio"        "0"
 "All"      "Limone"            "0"

怎么可能?

标签: mysqlsqlite

解决方案


将 aLEFT JOIN与子查询一起使用,并在未找到时0用作默认值。qty

SELECT COALESCE(t2.cp_store, 'All') AS cp_store, t1.name, COALESCE(t2.total, 0) AS qty
FROM tb_products AS t1
LEFT JOIN (
    SELECT cp_store, nome, SUM(CAST(qta AS DECIMAL(10, 1))) AS total 
    FROM tb_store 
    WHERE  data_out is null 
    GROUP BY cp_store, nome 
    ORDER BY cp_store, nome) AS t2 ON t1.name = t2.nome

推荐阅读