SQL 查询遇到问题

问题描述 投票:0回答:2

有人问我这个问题:

有多少客户在其所在城市以外的城市进行交易?您需要找到每个客户的主分行位置并将其与他们的交易位置(即交易城市)进行比较。

我有 3 张桌子,一张用于

branchdata
,有两列,
branchnumber
location

Customerdata
customerid
name
age
city
homebranch
accountbalance

transactiondata
transactionid
transactionamount
transactioncity
customerid
accountnumber

我无法加入

customerdata
transactiondata
表以查看
customerid
transactioncity
homebranch

任何有关从哪里开始的帮助将不胜感激。

我已经尝试过这两个查询

select customerid, city, homebranch
from customerdata 

select Transactioncity, customerid
from transactiondata

我可以通过分别查看这两个来获得答案,但我假设这一切都应该在一个查询中完成。

sql
2个回答
0
投票
  1. 首先,您需要通过键连接表。为此,您将使用 JOIN 命令:
  FROM customerdata c
    JOIN transactiondata t ON c.customerid = t.customerid
    JOIN branchdata b ON c.homebranch = b.branchnumber
  1. 要过滤交易以便从主分支中删除这些交易,您可以使用 WHERE 子句:
  WHERE t.transactioncity <> b.location
  1. 最后,您可以选择唯一客户的数量,并使用内置的 SQL 函数 COUNT 对其进行计数。 DISTINCT 指令将确保结果将丢弃重复的客户。
  SELECT COUNT(DISTINCT c.customerid) AS num_customers

将上面的所有内容都包裹起来:

SELECT COUNT(DISTINCT c.customerid) AS num_customers
FROM customerdata c
JOIN transactiondata t ON c.customerid = t.customerid
JOIN branchdata b ON c.homebranch = b.branchnumber
WHERE t.transactioncity <> b.location;

0
投票

正如上面的 Luty 所示,要解决这个问题,你需要 JOIN 表 所以我们打电话吧 客户-c 交易-t 分支 - b (但据我了解,此任务不需要分支)

此时我们可以进行选择

SELECT COUNT(*)
FROM customerdata AS c
JOIN transactiondata AS t ON c.customerid = t.customerid
WHERE c.city != t.transactioncity

让我们分解查询 我们

SELECT COUNT(*)
选择与我们的
WHERE c.city != t.transaction
正确的行数,因此我们检查 c - 客户城市是否与 t - 交易城市不同,如果它们
!=
不相同,则将被计数

FROM customerdata
意味着我们主要访问 customerdata 表的数据,但由于我们需要超过 1 个具有相似字段的表来识别它们,因此我们需要为每个表命名一个别名,例如将它们的名称缩写为 1 个字母,如“c” 我们用
AS c

来做到这一点

与您的查询相比,我添加了

JOIN transactiondata AS t ON c.customerid = t.customerid
,这意味着我们将添加表transactiondata中的所有字段
to our customerdata but as before we need to name it to recognize witch table we access to we adds
AS t
after this we need to clarify which data from transactiondata matches customerdata so we add statement
c.customerid = t.customerid``

但目前我们只

COUNT(*)
所有在其他城市然后客户在家进行的交易

因此,为了只计算每个客户一次,我们必须通过调用

DISTINCT
到我们想要唯一的字段来使其唯一

所以我们最终得到这样的查询

SELECT COUNT(DISTINCT c.customerid)
FROM customerdata AS c
JOIN transactiondata AS t ON c.customerid = t.customerid
WHERE c.city != t.transactioncity
© www.soinside.com 2019 - 2024. All rights reserved.