SQL Server: выберите разные даты плюс условие и количество - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу выбрать и сосчитать отдельные дни из одного столбца, а также исключить те, которые имеют определенное значение в другом столбце.

Структура таблицы выглядит следующим образом:

+-------------------------+-------------------------+
|           DAY           |          CHECK          |
+-------------------------+-------------------------+
| 2018-07-18 00:00:00.000 | 2018-07-18 12:46:35.000 |
| 2018-07-19 00:00:00.000 | 2018-07-19 15:58:14.000 |
| 2018-07-20 00:00:00.000 | 2018-07-20 15:52:57.000 |
| 2018-07-21 00:00:00.000 | 2018-07-21 00:00:00.000 |
| 2018-07-23 00:00:00.000 | 2018-07-23 08:54:49.000 |
| 2018-07-23 00:00:00.000 | 2018-07-23 12:52:41.000 |
| 2018-07-26 00:00:00.000 | 2018-07-26 08:55:34.000 |
+-------------------------+-------------------------+

Таким образом, ожидаемый результат будет подсчетом различных дней в столбце DAY, и из этого числа исключить все, день из столбца CHECK, который имеет это время 00: 00: 00.000.

В этом случаерезультат подсчета будет 5 дней

Мне удалось подсчитать дни, но я не вычислил условную часть столбца проверки

COUNT(DISTINCT DAY) AS 'TotalDays',

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Как насчет этого:

SELECT COUNT(DISTINCT [DAY]) AS 'TotalDays'
FROM tbl
WHERE [CHECK] <> DATEADD(day, DATEDIFF(day, 0, [CHECK]), 0);

Глядя на ваши примеры данных, может быть достаточно выражения WHERE WHERE [CHECK] <> [DAY].

0 голосов
/ 20 сентября 2018

Вы можете использовать GROUP BY и затем выполнить проверку с помощью предложения HAVING:

declare @tmp table ([day] datetime , [check] datetime)

insert into @tmp values
 ('2018-07-18 00:00:00.000','2018-07-18 12:46:35.000')
,('2018-07-19 00:00:00.000','2018-07-19 15:58:14.000')
,('2018-07-20 00:00:00.000','2018-07-20 15:52:57.000')
,('2018-07-21 00:00:00.000','2018-07-21 00:00:00.000')
,('2018-07-23 00:00:00.000','2018-07-23 08:54:49.000')
,('2018-07-23 00:00:00.000','2018-07-23 12:52:41.000')
,('2018-07-26 00:00:00.000','2018-07-26 08:55:34.000')

select [DAY] 
from @tmp
group by [DAY]
having min(cast ([check] as time)) <> '00:00:00.0000000'

Результат:

enter image description here

Поскольку вы хотите подсчет, вы можете заключить оператор в другое выделение:

select count(*) as TotalDays
from
(
    select [DAY] 
    from @tmp
    group by [DAY]
    having min(cast ([check] as time)) <> '00:00:00.0000000'
) T

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...