【问题标题】:Distinct Count with two tables两个表的不同计数
【发布时间】:2015-12-03 21:52:16
【问题描述】:

我有两张关于 Access、Customer 和 Transaction 的表。我正在尝试查找按 Dogs (0-3) 排序的交易总数。 Transaction 表对购买的每件商品都有一行,因此一个 TransactionID 可以有多行。

这是我目前所拥有的:

SELECT Customer.Dogs, COUNT(Transaction.TransactionID) AS TotTrans
FROM Transaction, Customer
WHERE Transaction.CustomerID = Customer.CustomerID
GROUP BY Dogs

我得到了

Dogs | TotTrans
0    | 130104
1    | 59132
2    | 17811
3    | 1401

显然,这会计算事务表中的总行数,并按狗的数量对其进行排序。但是,它会计算交易表中的重复项(例如,TransactionID = 2 的三行,因为在该交易中客户购买了 3 件商品。计数显然包括额外的 2 行)。

当我尝试做COUNT(DISTINCT Transaction.TransactionID) 它不起作用,并且消息

“查询表达式 'COUNT(DISTINCT Transaction.TransactionID)' 中的语法错误(缺少运算符)。

我环顾四周,但似乎找不到解决方案。我认为部分问题源于我选择了两个属性。

如果有人可以帮助解释该做什么及其背后的逻辑,那就太好了!

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 访问,抱歉,将编辑。
  • 注意,顺便说一句,隐式连接(在 from 子句中有两个表)是一种不推荐使用的语法,建议切换到现代的显式语法:学习如何使用显式连接句法。 Aaron Bertrand 对此做了一些writting
  • 我会调查的,谢谢!

标签: sql count distinct


【解决方案1】:

您应该将客户表与已经不同的表连接起来(使用内部查询)

SELECT Customer.Dogs, COUNT(distinctTransactions.TransactionID) AS TotTrans
FROM (select distinct TransactionID,CustomerID from Transaction) as 
distinctTransactions, Customer
WHERE distinctTransactions.CustomerID = Customer.CustomerID
GROUP BY Dogs

【讨论】:

    【解决方案2】:

    您应该学会使用正确的join 语法。此外,表别名使查询更易于编写和阅读:

    SELECT c.Dogs, COUNT(DISTINCT t.TransactionID) AS TotTrans
    FROM Transaction t JOIN
         Customer c
         ON t.CustomerID = c.CustomerID
    GROUP BY c.Dogs
    ORDER BY c.Dogs;
    

    【讨论】:

    • 我才刚刚开始,所以这个周末我会更多地研究“加入”,谢谢你指导我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多