SQL Server — Pivot: подсчет / отчетность количества записей, вставленных в 100 промежуточных таблиц

#sql #sql-server

#sql #sql-server

Вопрос:

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

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

 Name of tables             Day 1    Day 2   Day 3 Day 4 Day 5
--------------------------------------------------------------
AAAAA                       100     50       30    60   90
  

С уважением

Комментарии:

1. На сколько дней вы хотите вернуться назад и что определяет день 1?

2. Мы хотим просмотреть это за месяц — например, с 1 по 30 сентября

Ответ №1:

Вам нужно несколько разных шагов.

DATEDIFF(DAY, <timestamp>, getDate()) вы получите количество дней назад для записи.

Используя РЕГИСТР внутри СУММЫ, вы можете сделать что-то вроде…

 SELECT
  'AAAA'                                                                      AS TableName,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 1 THEN 1 ELSE 0 END)  AS Day1,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 2 THEN 1 ELSE 0 END)  AS Day2,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 3 THEN 1 ELSE 0 END)  AS Day3,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 4 THEN 1 ELSE 0 END)  AS Day4,
  etc, etc
FROM
  AAAA

UNION ALL

SELECT
  'BBBB'                                                                      AS TableName,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 1 THEN 1 ELSE 0 END)  AS Day1,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 2 THEN 1 ELSE 0 END)  AS Day2,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 3 THEN 1 ELSE 0 END)  AS Day3,
  SUM(CASE WHEN DATEDIFF(DAY, <timestamp>, getDate()) = 4 THEN 1 ELSE 0 END)  AS Day4,
  etc, etc
FROM
  BBBB

UNION ALL

etc, etc
  

Для этого требуется, чтобы код повторялся для каждой таблицы, которую вы запрашиваете. Но я думаю, что вы застряли, делая это так или иначе, несмотря ни на что.

Альтернативой было бы установить триггер для каждой таблицы и по мере вставки / удаления данных обновлять таблицу отслеживания новыми деталями. Это предполагает написание 100 триггеров вместо 100 объединений.

Без написания динамического SQL я не знаю никаких других принципиально отличных способов сделать это, чтобы избежать написания фрагмента кода 100 раз…