2017-08-11 34 views
-2

我有如下3个表计数:SQL点心和与多个条件和表

Cust_table columns: C_ID, C_Country 
Store_table columns: S_ID, S_Name, S_Country 
Tran_table columns: C_ID, S_ID, S_Type, Spending 

Cust_table

C_ID C_Country 
999 CN 
888 TW 

Store_table

S_ID S_Name S_Country 
123 ABC  CN 
456 DEF  JP 
789 GHI  CN 

Tran_table

C_ID S_ID S_Type Spending 
999 123 ML  106 
888 123 ML  642 
888 456 Outlet 364 
888 789 ML  422 
999 456 ML  263 

问题: 找出本地和非本地客户的数量以及他们在各个商店的消费情况,通过S_country和S_Type订购。 (S_Country = C_Country定义本地和非本地客户&支出)

ANS必填字段:S_Country,S_ID,S_NAME,No_Local,Local_Spending,No_NonLocal,NonLocal_Speding

预期结果

S_Country S_ID S_Name No_Local Local_Speding No_NonLocal NonLocal_Spending 
CN  123 ABC  1  106   1   642 
CN  789 GHI  0  0    1   422 
JP  456 DEF  0  0    2   627 

我最初的想法是用count/countif(?)来找出本地和非本地支出的数量,总支出的总和。 但我不知道如何在一个查询中包含所有条件。 任何人都可以请帮忙吗?谢谢。

到目前为止,我有

SELECT DISTINCT store_table.S_Country, 
store_table.store_ID, 
Store_table.store_name, 
SUM (spending) 

FROM store_table, tran_table 

WHERE Store_table.store_ID=tran_table.store_ID; 
+0

请添加表结构虚拟值和预期结果 – Shibon

+0

你尝试过这么远吗?如果你自己先尝试一下,并在这里发布代码,如果它不工作并发布样本数据和期望的输出,那将会很好。 – Learning

+0

s_type字段是否具有国家名称或者s_country名称/ c_country取决于它是本地/非本地客户? – Aparna

回答

0

很可能没有匹配的交易,商店,所以你必须使用外部联接。

使用CASE expressions以除去不需要的(非)本地值:

SELECT S_Country, 
     S_ID, 
     SUM(CASE WHEN S_Country = C_Country THEN 1  END) AS No_Local, 
     SUM(CASE WHEN S_Country = C_Country THEN Spending END) AS Local_Spending, 
     SUM(CASE WHEN S_Country <> C_Country THEN 1  END) AS No_NonLocal, 
     SUM(CASE WHEN S_Country <> C_Country THEN Spending END) AS NonLocal_Spending 
FROM Store_table 
LEFT JOIN Tran_table USING (S_ID) 
LEFT JOIN Cust_table USING (C_ID) 
GROUP BY S_ID;