2013-08-21 37 views
0

我正在嘗試查找在錄製表中有超過100條記錄的人列出的天數。它有條款存在問題,但我不知道如何區分人數。 where子句也存在問題,我也嘗試將「Count(Recordings.ID)> 100」放在哪裏,但這也不起作用。以下是我迄今爲止:SQL按日和按用戶查找記錄數

SELECT Person.FirstName, 
     Person.LastName, 
     Count(Recordings.ID) AS DAYS_ABOVE_100 
FROM Recordings 
JOIN Person ON Recordings.PersonID=Person.ID 
WHERE DAYS_ABOVE_100 > 100 
AND Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000' 
GROUP BY Person.FirstName, 
     Person.LastName 
HAVING Count(DISTINCT PersonID), Count(Distinct Datepart(day, created)) 
ORDER BY DAYS_ABOVE_100 DESC 

的實例數據我想:

First Last Days_Above_100 
John Doe  5 
Jim Smith 12 

這意味着,在給定的時間幀的天5,李四有超過100記錄每一天。

回答

1

貪圖可讀性,我將問題分解成兩個部分。

首先,找出每個人每天有多少錄音。這是公用表表達式中的查詢(第一個選擇語句)。然後選擇公用表表達式來將行限制爲僅限於那些您需要的行。

with cteRecordingsByDate as 
(
    SELECT Person.FirstName, 
     Person.LastName, 
     cast(created as date) as Whole_date, 
     Count(Recordings.ID) AS Recording_COUNT 
    FROM Recordings 
    JOIN Person ON Recordings.PersonID=Person.ID 
    WHERE Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000' 
    GROUP BY Person.FirstName, Person.LastName, cast(created as date) 
) 

select FirstName, LastName, count(*) as Days_Above_100 
from cteRecordingsByDate 
where Recording_COUNT > 100 
order by count(*) desc 
+0

我只需要在倒數第二行添加「Group By FirstName,LastName」並且它工作正常!謝謝你的幫助! – Klay

0

您可以使用子查詢來計算您想要的值。內部查詢計算每天的記錄數。外部子查詢然後計算天數超過100個的數量(以及個人信息加爲好):

SELECT p.FirstName, p.LastName, 
     count(*) as DaysOver100 
FROM (select PersonId, cast(Created as Date) as thedate, count(*) as NumRecordings 
     from Recordings r 
     where Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000' 
    ) r join 
    Person p 
    ON r.PersonID = p.ID 
WHERE r.NumRecordings > 100 
GROUP BY p.FirstName, p.LastName; 

此使用SQL Server語法從datetimedate轉換。在其他數據庫中,您可以使用trunc(created)date(created)從日期時間提取日期。

+0

我相信他需要'HAVING'子句來隔離錄音表中有超過100個條目的日子。 –

+0

@GoatCO。 。 。點擊。我知道了。文中的描述和查詢似乎沒有描述相同的數據結構。我完全修改了答案。 –

0

你應該試試這個:

SELECT SUBQUERY.FirstName, 
     SUBQUERY.LastName, 
     Count(*) AS DAYS_ABOVE_100 
FROM 
(
    SELECT Person.FirstName, 
      Person.LastName, 
      Count(Recordings.ID) AS COUNT_RECORDINGS 
    FROM Recordings 
    JOIN Person ON Recordings.PersonID=Person.ID 
    WHERE Created BETWEEN '2013-08-01 00:00:00.000' AND 
          '2013-08-21 00:00:00.000' 
    GROUP BY Person.FirstName, 
       Person.LastName, 
       Created 
    HAVING Count(Recordings.ID) > 100 
)SUBQUERY 
GROUP BY SUBQUERY.FirstName, 
      SUBQUERY.LastName 
ORDER BY Count(*) DESC 

想那HAVING子句就像一個Where子句,而是一個接受集合體,如SUM(source)。您的查詢有一定的誤差,即:

  • 一個聚集WHERE子句,但Where子句不接受聚集。
  • 您在ORDER BY子句中引用聚合「Count(Recordings.ID)」的別名「DAYS_ABOVE_100」。您不能在您定義該別名的相同select中使用其別名訪問列。只能通過查詢外部的別名訪問列,就像查爾斯的回答一樣。

編輯:

對不起,我沒有注意到的 「白天」 部分,編輯查詢。添加創建的列到GROUP BY子句每天獲得總記錄數,然後將其包裝在另一個查詢中以統計結果,再按FirstName和Lastname分組。

+0

這隻給我每個人在整個時間範圍內的總記錄 – Klay

0

我覺得這是你以後有什麼:

SELECT p.FirstName, 
     p.LastName, 
     COUNT(*) AS DAYS_ABOVE_100 
FROM (SELECT PersonID, Created, COUNT(*) 
     FROM Recordings 
     GROUP BY ID,Created 
     HAVING COUNT(*) > 100 
     )r 
JOIN Person p 
    ON r.PersonID = p.ID 
WHERE Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000' 
GROUP BY p.FirstName, 
      p.LastName 
ORDER BY DAYS_ABOVE_100 DESC