#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
*/