sql получает distinct и обрезает один столбец при подсчете количества значений в другом столбце

#sql #sql-server

#sql #sql-server

Вопрос:

По сути, мне нужен sql-запрос, который вернет различные значения для 1 столбца, а затем обрезает результаты (DateTime), чтобы показывать только дату. И в других моих столбцах должно быть количество элементов с этого дня.

Я попробовал следующее:

  Select LoggedDate as Date, count(ID) as Amount from Tickets WHERE LoggedDate >=dateadd(day,datediff(day,0,GetDate())- 30,0) AND State = '1' group by LoggedDate

ID   |  Date                   | Amount
---------------------------------------- 
1    | 2016-09-23 11:54:12.000 | 1 
2    | 2016-09-29 09:23:58.000 | 1 
3    | 2016-09-29 09:34:07.000 | 1 
4    | 2016-09-29 09:41:12.000 | 1 
5    | 2016-09-29 09:53:37.000 | 1 
6    | 2016-09-29 09:57:17.000 | 1 
7    | 2016-09-29 10:01:53.000 | 1 
8    | 2016-10-03 21:10:27.000 | 1 
9    | 2016-10-04 03:20:51.000 | 1 
10   | 2016-10-04 03:47:34.000 | 1 
11   | 2016-10-04 03:50:09.000 | 1
  

Я пробовал что-то вроде:

 Select DISTINCT(LEFT(LoggedDate, 11)) AS Date, count(ID) as Amount from Tickets WHERE LoggedDate >=dateadd(day,datediff(day,0,GetDate())- 30,0) AND State = '1' group by LoggedDate

ID   |  Date        | Amount
----------------------------
1    | OCT 3  2016  |1
2    | OCT 2  2016  |1
3    | SEP 22 2016  |1
4    | SEP 23 2016  |1
5    | SEP 29 2016  |1
  

Я хочу, чтобы приведенное ниже, но не уверен, как получить мои данные таким образом:

 ID   |  Date       | Amount
---------------------------
1    | 2016-09-23  |1
2    | 2016-09-29  |5
3    | 2016-10-03  |1
4    | 2016-10-03  |1
5    | 2016-10-04  |2
  

Ответ №1:

Попробуйте использовать приведенный ниже сценарий.

 SELECT ROW_NUMBER() OVER ( ORDER BY (select 1) ) AS id
       ,CAST(LoggedDate as date) AS Date
       , count(ID) as Amount 
FROM Tickets 
WHERE LoggedDate >=dateadd(day,datediff(day,0,GetDate())- 30,0) AND State = '1' 
GROUP BY  CAST(LoggedDate as date)
  

Ответ №2:

Если я правильно понял, вы можете попробовать это:

 SELECT ROW_NUMBER() Over(ORDER BY Date) [Id], *
FROM 
(
    SELECT CONVERT(VARCHAR(35), LoggedDate, 106) [Date], SUM(Amount) [Total]
    FROM Tickets
    GROUP BY CONVERT(VARCHAR(35), LoggedDate, 106)
) a
  

Вы можете поэкспериментировать с форматом даты, изменив третий параметр в CONVERT функции.

Вам также нужно будет поставить какие-либо условия и т. Д.

Ответ №3:

Я думаю, что вам нужно что-то вроде этого:

 SELECT DATE(LoggedDate) AS date, COUNT(id) AS Amount 
FROM Tickets 
WHERE state = 1 
GROUP BY DATE(LoggedDate);
  

Ответ №4:

Я просто догадываюсь о вашей структуре таблицы, но вот пример кода, который я собрал:

 DECLARE @t TABLE ( id INT, loggedDate DATETIME ) 

INSERT INTO @t ( id, loggedDate ) VALUES ( 1, '2016-09-23 11:54:12.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 2, '2016-09-29 09:23:58.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 3, '2016-09-29 09:34:07.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 4, '2016-09-29 09:41:12.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 5, '2016-09-29 09:53:37.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 6, '2016-09-29 09:57:17.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 7, '2016-09-29 10:01:53.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 8, '2016-10-03 21:10:27.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 9, '2016-10-04 03:20:51.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 10, '2016-10-04 03:47:34.000' ) 
INSERT INTO @t ( id, loggedDate ) VALUES ( 11, '2016-10-04 03:50:09.000' ) 




SELECT ROW_NUMBER() OVER ( ORDER BY CONVERT(DATE,loggedDate) ) AS id, CONVERT(DATE, loggedDate) AS loggedDate, COUNT(1) AS amount
FROM @t
GROUP BY CONVERT(DATE,loggedDate)

/* output 
id  loggedDate  amount
1   2016-09-23  1
2   2016-09-29  6
3   2016-10-03  1
4   2016-10-04  3
*/