亲爱的,我在MS Access SQL中有一个问题。我有4张桌子。
在Union All和SUM之后,到目前为止,我有所有CO个数的COUNT。现在我需要按行和按列的所有SUM的SUM。谢谢您的帮助。
当前结果:
ID Name 5/1/2018 5/2/2018 5/3/2018 Count
-- ----- -------- -------- -------- -----
1 Susan 20 30 45 3
2 Juan 15 70 2
3 Tracy 50 60 40 3
4 Jenny 60 8 60 3
5 Bill 100 1
预期结果
ID Name 5/1/2018 5/2/2018 5/3/2018 Count E_Total
-- ----- -------- -------- -------- ----- -------
1 Susan 20 30 45 3 95
2 Juan 15 70 2 85
3 Tracy 50 60 40 3 150
4 Jenny 60 8 60 3 128
5 Bill 100 1 100
D_Total 145 168 245 558
当前查询:
select es.EmpID, es.FirstName,
sum(switch(es.DateS = #5/1/2018#, es.Amount)) AS [5/1/2018],
sum(switch(es.DateS = #5/2/2018#, es.Amount)) AS [5/2/2018],
sum(switch(es.DateS = #5/3/2018#, es.Amount)) AS [5/3/2018],
(max(iif(es.DateS = #5/1/2018#, 1, 0)) +
max(iif(es.DateS = #5/2/2018#, 1, 0)) +
max(iif(es.DateS = #5/3/2018#, 1, 0))
) as num_dates
from (
select e.EmpID, e.FirstName, s.DateS, s.Amount
from Employee as e inner join
Sale as s on ( s.EmployeeID = e.EmpID AND s.Amount IS NOT NULL)
where s.DateS between #5/1/2018# and #5/3/2018#
union all
select e1.EmpID, e1.FirstName, s1.DateS, s1.Amount
from Employee1 as e1 inner join
Sale1 as s1 on ( s1.EmployeeID = e1.EmpID and s1.Amount IS NOT NULL)
where s1.DateS between #5/1/2018# and #5/3/2018#
) as es
group by es.EmpID, es.FirstName
order by es.EmpID;
我在这里有表格和查询。
如图所示,列“E_Total”和行“D_Total是我需要它们的样子。或者,我应该停在这里并在VB.NET中编写DataGridView来完成这项工作吗?非常感谢您的帮助或建议。
答案 0 :(得分:1)
您实际上在计算哪些列不为空。因为你在一行中计算,最简单的方法就是使用IIF
语句:
SELECT DISTINCT EmpID, FirstName,
Sum(Switch(q.DateS = #5/1/2018#, q.Amount)) AS [5/1/2018],
Sum(Switch(q.DateS = #5/2/2018#, q.Amount)) AS [5/2/2018],
Sum(Switch(q.DateS = #5/3/2018#, q.Amount)) AS [5/3/2018]
Iif(Sum(Switch(q.DateS = #5/1/2018#, q.Amount)) Is Not Null, 1, 0) +
Iif(Sum(Switch(q.DateS = #5/2/2018#, q.Amount)) Is Not Null, 1, 0) +
Iif(Sum(Switch(q.DateS = #5/3/2018#, q.Amount)) Is Not Null, 1, 0) As [Count]
FROM
(
SELECT u1.EmpID, u1.FirstName, a1.DateS, a1.Amount
FROM Employee AS u1
INNER JOIN Sale AS a1
ON (a1.EmployeeID = u1.EmpID AND a1.Amount IS NOT NULL)
WHERE a1.DateS BETWEEN #5/1/2018# AND #5/3/2018#
UNION ALL
SELECT u2.EmpID, u2.FirstName, a2.DateS, a2.Amount
FROM Employee1 AS u2
INNER JOIN Sale1 a2 ON (a2.EmployeeID = u2.EmpID AND a2.Amount IS NOT NULL)
WHERE a2.DateS BETWEEN #5/1/2018# AND #5/3/2018#
) AS q
GROUP BY q.EmpID, q.FirstName
ORDER BY q.EmpID;
请注意,有时,您可以在使用其他计算列进行计算时引用列名称,例如: Iif([5/1/2018] Is Not Null
。我不知道Access的时间和不允许的具体细节,所以我倾向于避免它。
答案 1 :(得分:1)
在另一个数据库中,您将使用count(distinct)
。这不是MS Access中的一个选项。
我会把它写成:
select es.EmpID, es.FirstName,
sum(switch(es.DateS = #5/1/2018#, es.Amount)) AS [5/1/2018],
sum(switch(es.DateS = #5/2/2018#, es.Amount)) AS [5/2/2018],
sum(switch(es.DateS = #5/3/2018#, es.Amount)) AS [5/3/2018],
(max(iif(es.DateS = #5/1/2018#, 1, 0)) +
max(iif(es.DateS = #5/2/2018#, 1, 0)) +
max(iif(es.DateS = #5/3/2018#, 1, 0))
) as num_dates
from (
select e.EmpID, e.FirstName, s.DateS, s.Amount
from Employee as e inner join
Sale as s on (s.EmployeeID = e.EmpID AND s.Amount IS NOT NULL)
where s.DateS between #5/1/2018# and #5/3/2018#
union all
select e1.EmpID, e1.FirstName, s1.DateS, s1.Amount
from Employee1 as e1 inner join
Sale1 as s1 on (s1.EmployeeID = e1.EmpID and s1.Amount IS NOT NULL)
where s1.DateS between #5/1/2018# and #5/3/2018#
) as es
group by es.EmpID, es.FirstName
order by es.EmpID;
注意:
select distinct
几乎从未与group by
一起使用。在这种情况下你肯定不需要它。