簡體   English   中英

MySQL通過不返回正確的結果進行分組

[英]MySQL count with group by not returning correct result

我有一個正在嘗試生成報告的票務系統。 我正在嘗試獲取每個用戶涉及的票數。 有了第一個查詢:

SELECT * FROM (
SELECT TicketID, UserID, EventDateTime
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
ORDER BY EventDateTime DESC) x
WHERE UserID=80
GROUP BY TicketID;

我能夠列出針對特定用戶的票證,並且可以手動對其進行計數:

TicketID    UserID  EventDateTime
99168       80      6/22/2016 13:21
99193       80      6/22/2016 7:42
99213       80      6/22/2016 13:02
99214       80      6/22/2016 6:30
99221       80      6/22/2016 6:57
99224       80      6/22/2016 7:48
99226       80      6/22/2016 6:27
99228       80      6/22/2016 8:49
99229       80      6/22/2016 8:53
99232       80      6/22/2016 9:18
99237       80      6/22/2016 13:08

但是,當我嘗試刪除WHERE UserID =語句,並嘗試將其用作子查詢時,如下所示:

SELECT UserID, COUNT(*) as count FROM (
    SELECT * FROM (
    SELECT TicketID, UserID, EventDateTime
    FROM dcscontact.ticketevents
    WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
    ORDER BY EventDateTime DESC) x
    GROUP BY TicketID) y
GROUP BY UserID;

我得到不正確的計數:

UserID  count
9       2
28      1
31      1
42      1
80      5
95      1
99      6
108     4
116     12
117     26
123     24

如您所見,UserID 80的計數應該為11。其他大多數結果也不正確,它們似乎都比我預期的要少。

在子查詢上使用GROUP BY / COUNT時,我做錯什么了嗎? 如何更改查詢以獲得所需的結果?

您是否只想匯總?

SELECT UserID, COUNT(*)
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;

如果對於一個給定用戶,同一票證可以多次出現在數據中,則COUNT(DISTINCT)更合適:

SELECT UserID, COUNT(DISTINCT TicketID)
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;

要獲取每個用戶觸摸的票證數量 ,讓我們從正確的查詢開始:

SELECT count(*) as N, UserID
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;

GROUP BY子句應始終包括SELECT子句中提到的所有非聚合列。 詢問“票證ID和票證數量(每位用戶)”是沒有意義的!

另外,SQL標准說ORDER BY不能應用於子查詢。 最好將ORDER BY視為查看輸出的便利,而不是查詢中使用的信息。

您還想知道一些關於TicketIDEventDateTime 您不能要求輸入“票證編號”,但可以獲取第一張和最后一張票證。 時間相同:

SELECT   count(*) as N
       , min(TicketID) as T1
       , max(TicketID) as Tn
       , min(EventDateTime) as E1
       , max(EventDateTime) as En
   , UserID
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;

請注意,最早的時間可能不是最小的TicketID的時間。 要獲取有關每個用戶的第一張票證以及計數的所有信息,請結合以下兩種信息來源:

select N.N, T.* 
from dcscontact.ticketevents as T
join (
    SELECT count(*) as N, min(TicketID) as T1, UserID
    FROM dcscontact.ticketevents
    WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
    GROUP BY UserID;
) as N
on  T.UserID = N.UserID 
and T.TicketID = N.TicketID
-- and maybe others, according to the key
order by EventDateTime DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM