sql联接问题-未提供预期输出
我是一个SQLNoob,所以这对你们来说可能是非常基本的,但我在这里很难应用一些逻辑。我试图从两个表(供应商与消费者表)中生成一个所有城市和州的列表,并通过第三个transact表链接,列出每个城市的供应商和消费者数量(按分组)。需要注意的是,两个表中的城市和州的数量不匹配。对于那些匹配的,我需要一个显示相应供应商和消费者数量的输出,如果一个表中存在州/市,而另一个表中不存在,我需要在相应的数字列下显示一个零的数字计数。 我有3个表-供应商、消费者和交易,通过Supp_ID和Con_ID作为键链接,如下面代码中所述sql联接问题-未提供预期输出,sql,join,Sql,Join,我是一个SQLNoob,所以这对你们来说可能是非常基本的,但我在这里很难应用一些逻辑。我试图从两个表(供应商与消费者表)中生成一个所有城市和州的列表,并通过第三个transact表链接,列出每个城市的供应商和消费者数量(按分组)。需要注意的是,两个表中的城市和州的数量不匹配。对于那些匹配的,我需要一个显示相应供应商和消费者数量的输出,如果一个表中存在州/市,而另一个表中不存在,我需要在相应的数字列下显示一个零的数字计数。 我有3个表-供应商、消费者和交易,通过Supp_ID和Con_ID作为键链
SELECT S.State, S.City, COUNT(S.Supp_ID) AS Supp_Count, COUNT(C.Con_ID) AS Cust_Count
FROM SuppTb S, TransTb T, ConsTb C
WHERE S.Supp_ID = T.Supp_ID AND T.Con_ID = C.Con_ID
GROUP BY S.State, S.City
如果我输入这个查询,我会得到供应商和消费者的奇怪数字。我最好的猜测是,在那里的某个地方必须有一个自连接,但不确定如何从这里开始。任何帮助都将不胜感激!谢谢你
附言:
及
分别从两个表中提供所需的输出。输出1有3列7行,输出2有3列6行。我需要一个4列8行的组合输出。只需要找出一种方法来组合这两个输出,并在需要的地方插入零
编辑-确切的问题是生成一份供应商或消费者州和城市的比较列表,其中包含每个城市的供应商和消费者的各自数量。期望输出-
State City Supp_count Cons_count
Illinois Chicago 2 3
Illinois Springfield 2 0
Michigan Lansing 0 3
如果supp/cons表未列出城市/州,则输出为0
编辑2-尝试了这段代码,给了我想要的客户数量,但给了奇怪的供应商数量。我现在完全被卡住了!没有主意了
SELECT C.State, C.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count, COUNT(DISTINCT C.Con_ID) AS Cust_Count
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T
ON S.Supp_ID = T.Supp_ID LEFT JOIN
Tb_Consumer C ON T.Con_ID = C.Con_ID
GROUP BY C.State, C.City
EXCEPT
SELECT S.State, S.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count, COUNT(DISTINCT C.Con_ID) AS Cust_Count
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T
ON S.Supp_ID = T.Supp_ID LEFT JOIN
Tb_Consumer C ON T.Con_ID = C.Con_ID
GROUP BY S.State, S.City
首先,切勿在FROM
子句中使用逗号。始终使用明确、正确的JOIN
语法
您的问题是,您沿着两个不相关的维度连接,因此您的查询为每个州
/城市
组合生成笛卡尔积。最简单的解决方案是使用COUNT(DISTINCT)
:
如果每个维度上没有太多的重复项,则此操作很好。更“合适”的解决方案是在进行连接之前进行聚合。更新-我自己得到了答案!!我首先创建了一个新表来列出我感兴趣的所有不同的州和城市(使用
UNION
而不是UNION all
来消除我之前得到的DUP),然后使用FULL JOIN
s将供应商和消费者表链接并组合到这个新表
啊!当你对编程语言完全陌生的时候,独自完成一个查询的乐趣是……无与伦比的!!
谢谢大家! 感谢您的时间,同意JOIN-in语法提供了很好的清晰度。但查询仍然没有给出所需的输出。。我做了一些编辑,包括我真正需要的,并包括了我使用左连接所做的最新跟踪。。获得了正确的客户数量,但仍然获得了大量的供应商数量(就像我运行您的查询时一样)@Cur123。您使用的是计数(独立)?是的,我使用了,林诺夫先生。我使用UNION得到了答案,首先创建了一个临时表,然后通过完整的外部联接将临时表链接到供应商和消费者表,以获得我想要的确切结果。花了很长时间,但最终还是很满意!我一拿到答案就自己发了。。如果我没有说清楚的话,我向你道歉。。再次感谢您的支持!我接受了你的建议,并使用了正确的语法进行连接,这确实让我更清楚了……再次感谢!)
State City Supp_count Cons_count
Illinois Chicago 2 3
Illinois Springfield 2 0
Michigan Lansing 0 3
SELECT C.State, C.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count, COUNT(DISTINCT C.Con_ID) AS Cust_Count
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T
ON S.Supp_ID = T.Supp_ID LEFT JOIN
Tb_Consumer C ON T.Con_ID = C.Con_ID
GROUP BY C.State, C.City
EXCEPT
SELECT S.State, S.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count, COUNT(DISTINCT C.Con_ID) AS Cust_Count
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T
ON S.Supp_ID = T.Supp_ID LEFT JOIN
Tb_Consumer C ON T.Con_ID = C.Con_ID
GROUP BY S.State, S.City
SELECT S.State, S.City,
COUNT(DISTINCT S.Supp_ID) AS Supp_Count,
COUNT(DISTINCT C.Con_ID) AS Cust_Count
FROM SuppTb S JOIN
TransTb T
ON S.Supp_ID = T.Supp_ID JOIN
ConsTb C
ON T.Con_ID = C.Con_ID
GROUP BY S.State, S.City;