我正在尝试执行下面的查询,但结果不同,但没有成功。
SELECT a.Nome
,c.Saldo
,COUNT(d.Apostador_ID) AS Depositos
,COUNT(s.Apostador_ID) AS Saques
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Deposito d ON a.ID = d.Apostador_ID
LEFT JOIN Saque s ON a.ID = s.Apostador_ID
GROUP BY a.Nome, c.Saldo
正在返回:
Nome Saldo Depositos Saques
Marcos 4857 180 180
Paulo 2868 180 180
Mariana 8348 180 180
Marcela -3512 180 180
Mario -2367 180 180
Maria -3359 180 180
但是每个结果应该是27。
谢谢!
编辑1:
INSERT INTO Apostadores
(`ID`, `Nome`, `CPF`, `Email`)
VALUES
(NULL, 'Marcos', '12345678901', 'marcos@email.com'),
(NULL, 'Paulo', '12345678902', 'paulo@email.com'),
(NULL, 'Mariana', '12345678903', 'mariana@email.com'),
(NULL, 'Marcela', '12345678904', 'marcela@email.com'),
(NULL, 'Mario', '12345678905', 'mario@email.com'),
(NULL, 'Maria', '12345678906', 'maria@email.com');
INSERT INTO Contas
(`ID`, `Apostador_ID`, `Saldo`)
VALUES
(NULL, '1', '700.00'),
(NULL, '2', '1000.00'),
(NULL, '3', '5000.00'),
(NULL, '4', '250.00'),
(NULL, '5', '365.00'),
(NULL, '6', '391.82');
INSERT INTO Deposito
(`ID`, `Apostador_ID`, `Valor_Depositado`)
VALUES
(NULL, '1', '700'),
(NULL, '2', '900'),
(NULL, '3', '580'),
(NULL, '4', '260'),
(NULL, '5', '360'),
(NULL, '6', '154'),
(NULL, '1', '1000'),
(NULL, '2', '1346'),
(NULL, '3', '2005'),
(NULL, '4', '360'),
(NULL, '5', '392'),
(NULL, '6', '182'),
(NULL, '1', '362'),
(NULL, '2', '182'),
(NULL, '3', '270'),
(NULL, '4', '390'),
(NULL, '5', '160'),
(NULL, '6', '380'),
(NULL, '1', '290'),
(NULL, '2', '370'),
(NULL, '3', '193'),
(NULL, '4', '256'),
(NULL, '5', '509'),
(NULL, '6', '536'),
(NULL, '1', '500'),
(NULL, '2', '190'),
(NULL, '3', '160'),
(NULL, '4', '380'),
(NULL, '5', '190'),
(NULL, '6', '170');
INSERT INTO Saque
(`ID`, `Apostador_ID`, `Valor_Sacado`)
VALUES
(NULL, '1', '100'),
(NULL, '2', '200'),
(NULL, '3', '100'),
(NULL, '4', '50'),
(NULL, '5', '55'),
(NULL, '6', '70'),
(NULL, '1', '80'),
(NULL, '2', '90'),
(NULL, '3', '65'),
(NULL, '4', '55'),
(NULL, '5', '45'),
(NULL, '6', '60'),
(NULL, '1', '35'),
(NULL, '2', '61'),
(NULL, '3', '99'),
(NULL, '4', '66'),
(NULL, '5', '55'),
(NULL, '6', '33'),
(NULL, '1', '88'),
(NULL, '2', '15'),
(NULL, '3', '20'),
(NULL, '4', '29'),
(NULL, '5', '36'),
(NULL, '6', '58');
这是上面的示例。我添加了4个表格,即Apostadores,Depositos,Saque和Contas。 我尝试过DISTINCT,但没有成功。
编辑2: 如果我尝试下面的查询,我可以为所有行获取正确的值,但是如果我再执行以下查询的联接,则会带来错误的值
SELECT a.Nome
,c.Saldo
,COUNT(d.ID)
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Depositos d ON a.ID = d.Apostador_ID
GROUP BY a.Nome, c.Saldo
这是带来错误值的查询。
SELECT a.Nome
,c.Saldo
,COUNT(d.ID)
,COUNT(s.ID)
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Depositos d ON a.ID = d.Apostador_ID
LEFT JOIN Saques s ON a.ID = s.Apostador_ID
GROUP BY a.Nome, c.Saldo
答案 0 :(得分:0)
要获得相同的结果,您需要为Saldo属性包括求和函数
SELECT a.Nome
,SUM(c.Saldo)
,COUNT(d.Apostador_ID) AS Depositos
,COUNT(s.Apostador_ID) AS Saques
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Deposito d ON a.ID = d.Apostador_ID
LEFT JOIN Saque s ON a.ID = s.Apostador_ID
GROUP BY a.Nome
答案 1 :(得分:0)
问题在于您要沿着不同的维度进行连接。并且,count()
仅计算非NULL
的值。
通常最好的解决方案是在您JOIN
之前汇总 。
不过,一种简单的解决方案是使用COUNT(DISTINCT)
:
SELECT a.Nome, c.Saldo
COUNT(DISTINCT d.id) AS Depositos
COUNT(DISTINCT s.id) AS Saques
FROM Apostadores a LEFT JOIN
Contas c
ON a.ID = c.Apostador_ID LEFT JOIN
Deposito d
ON a.ID = d.Apostador_ID LEFT JOIN
Saque s
ON a.ID = s.Apostador_ID
GROUP BY a.Nome, c.Saldo
答案 2 :(得分:0)
我在下面的查询中更改了一些内容,我不知道该怎么办,并且现在可以正常工作!
谢谢您的帮助!
SELECT a.Nome
,c.Saldo
,COUNT(DISTINCT d.ID) AS Depositos
,COUNT(DISTINCT s.ID) AS Saques
,SUM(d.Valor_Depositado) AS Valor_Depositado
,SUM(s.Valor_Sacado) AS Valor_Sacado
,COUNT(DISTINCT t.ID) AS Transferencias_Efetuadas
,SUM(t.Valor_Transferido) AS Valor_Enviado_Transferencia
,COUNT(DISTINCT ap.ID) AS Quantidade_Apostas
,SUM(ap.Valor_Apostado) AS Valor_Apostado
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Depositos d ON a.ID = d.Apostador_ID
LEFT JOIN Saques s ON a.ID = s.Apostador_ID
LEFT JOIN Transferencias t ON a.ID = t.Origem_Apostador_ID
LEFT JOIN Apostas ap ON a.ID = ap.Apostador_ID
GROUP BY a.Nome, c.Saldo