Считает из многих таблиц в один набор результатов - PullRequest
1 голос
/ 13 июля 2020

У меня есть несколько таблиц с уникальными идентификаторами продукта, идентификатором пользователя и датой.

Есть ли способ отобразить одну таблицу для отображения подсчетов в каждой таблице, разделенной между каждым идентификатором пользователя.

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

Например:

TblName user1 user2 user3
tbl1      1     2     3
tbl2      4     5     6
tbl3      7     8     9
tbl4      3     2     1

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Вы можете попробовать объединить сводный подход:

SELECT
    TblName,
    COUNT(CASE WHEN userId = 'user1' THEN 1 END) AS user1,
    COUNT(CASE WHEN userId = 'user2' THEN 1 END) AS user2,
    COUNT(CASE WHEN userId = 'user3' THEN 1 END) AS user3
FROM
(
    SELECT 'tbl1' AS TblName, userId, productId FROM tbl1 UNION ALL
    SELECT 'tbl2', userId, productId FROM tbl2            UNION ALL
    SELECT 'tbl3', userId, productId FROM tbl3            UNION ALL
    SELECT 'tbl4', userId, productId FROM tbl4
) t
GROUP BY
    TblName;
0 голосов
/ 13 июля 2020

Вы можете использовать условную агрегацию и union all

select 'table1' as tablename,
       sum(case when userid = 'user1' then 1 else 0 end) as user1,
       sum(case when userid = 'user2' then 1 else 0 end) as user2,
       sum(case when userid = 'user3' then 1 else 0 end) as user3
from table1
union all
select 'table2' as tablename,
       sum(case when userid = 'user1' then 1 else 0 end) as user1,
       sum(case when userid = 'user2' then 1 else 0 end) as user2,
       sum(case when userid = 'user3' then 1 else 0 end) as user3
from table2
union all
. . .;

Я не вижу никаких преимуществ в попытке использовать здесь pivot. Однако, если пользователи не известны, вам нужно будет использовать Dynami c SQL.

Примечание. Обычно это признак плохой модели данных, которая хранит одну и ту же информацию в нескольких таблицах. Как правило, вся такая информация должна быть в одной таблице.

...