sqllite запрос для подсчета по строкам - PullRequest
0 голосов
/ 12 октября 2019

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

У меня есть таблица DatabaseAudit со столбцами и некоторыми примерами значений ниже. Типом может быть «Вставить», «Обновить» или «Удалить»

Id, Timestamp, Type, RecordId
1, 637052212796419902, Update, 13
2, 637052213295073040, Update, 15
3, 637052213388962058, Update, 22
4, 637052213494632806, Update, 3
5, 637052213604466165, Update, 25

Когда Тип = «Вставить» или «Обновить», я записываю фактические значения в таблицу TableAudit со столбцами ниже

DatabaseAuditId, ColumnName, PreviousValue, NewValue
1, Col1, False, True
1, Col2, , P
2, Col1, False, True
2, Col2, , P
3, Col1, False, True
3, Col2, , M
4, Col1, True, False
4, Col2, , P
5, Col1, False, True
5, Col2, , M

У меня проблемы с генерацией запроса. Например, я бы хотел подсчитать количество записей в DatabaseAudit, где новое значение Col1 - «Истина», а новое значение Col2 - «P». Который для этого примера будет 2.

Ответы [ 3 ]

0 голосов
/ 12 октября 2019
SELECT count(*) AS MatchCount
FROM (SELECT id
      FROM DatabaseAudit AS d
      JOIN TableAudit AS t ON d.Id = t.DatabaseAuditId
      WHERE (t.ColumnName, t.NewValue) = ('Col1', 'True')
         OR (t.columnName, t.NewValue) = ('Col2', 'P')
      GROUP BY d.Id
      HAVING count(*) = 2);
MatchCount
----------
2         
0 голосов
/ 12 октября 2019

Для каждого DatabaseAuditId с ColumnName = 'Col1' and NewValue = 'True' проверьте, есть ли строка с одинаковыми DatabaseAuditId и ColumnName = 'Col2' and NewValue = 'P' с EXISTS:

select count(*) counter
from TableAudit t
where t.ColumnName = 'Col1' and t.NewValue = 'True'
and exists (
  select 1 from TableAudit
  where DatabaseAuditId = t.DatabaseAuditId and ColumnName = 'Col2' and NewValue = 'P'
)

См. Демонстрационную версию . Результаты:

| counter |
| ------- |
| 2       |
0 голосов
/ 12 октября 2019

Попробуйте это:

WITH q1 AS (SELECT DISTINCT Count(*) FROM TableAudit WHERE 
(ColumnName = 'Col1' AND NewValue = 'True') OR
(ColumnName = 'Col2' AND NewValue = 'P')
Group by DatabaseAuditId
)

SELECT count(*) FROM q1

Надеюсь, это поможет.

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