[英]SUM of the SUMs in MS Access SQL
親愛的,我在MS Access SQL中有一個問題。 我有4張桌子。
在Union All和SUM之后,到此為止,我擁有SUM總數的所有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進行編程以完成這項工作嗎?非常感謝您的幫助或建議。
您實際上是在計算哪些列不為空。 因為要在一行中計數,所以最簡單的方法就是使用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中何時允許和不允許的具體時間。 ,所以我傾向於避免這種情況。
在另一個數據庫中,您將使用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
。 在這種情況下,您當然不需要它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.