SQL Server 2014: количество проданных продуктов по каждому сотруднику - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть таблица Employee и таблица Product. Третья таблица (ProductsSold) содержит EmployeeID, ProductID, DateSold.

Таблица ProductsSold содержит продукт, проданный сотрудником на определенную дату.

Я пытаюсь подсчитать каждый продукт, проданный каждым сотрудником (даже если сотрудник продал 0 продуктов, которые ему нужно показать)

sample

select e.EmployeeName, p.ProductName, count(*) as c
from ProductsSold ps 
    inner join product p on ps.productid = p.productid
    inner join employee e on ps.employeeid = e.employeeid
group by e.EmployeeName, p.ProductName
order by e.EmployeeName

Нужно ли мне писать сводный запрос? Это станет отчет SSRS. Поддерживает ли SSRS сводные запросы?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

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

В вашем запросе было две проблемы,

  1. Он просто подсчитывал, сколько записей продаж он нашел
  2. Поскольку вашей основной таблицей являются продажи, а вы выполняете внутреннее объединение с сотрудниками, будут отображаться только сотрудники с записями продаж.

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

DECLARE @employees TABLE(EmployeeID int, EmployeeName varchar(64))
DECLARE @products TABLE(ProductID int, ProductName varchar(64))
DECLARE @sales TABLE(EmployeeID int, ProductID int, Qty int, SaleDate date)

INSERT INTO @employees VALUES (1, 'Dave'), (2,'Bob'), (3, 'Mary')
INSERT INTO @products VALUES (1, 'Cars'), (2, 'Bikes'), (3, 'Trucks') 
INSERT INTO @sales VALUES 
    (1,1,5, '2019-04-30'), (1,1,10, '2019-04-30'), (1,2,11, '2019-04-29'), 
    (2,1,12, '2019-04-28'), (2,2,13, '2019-04-30'), (2,3,14, '2019-04-29')


SELECT 
        e.EmployeeName, p.ProductName, SUM(Qty) AS Qty
    FROM @employees e 
    LEFT JOIN @sales s on e.EmployeeID = s.EmployeeID
    LEFT JOIN @products p on s.ProductID = p.ProductID
group by e.EmployeeName, p.ProductName
order by e.EmployeeName

На этот раз мы начнем с сотрудников и LEFT JOIN с других таблиц.Это гарантирует, что все сотрудники будут отображаться.

На основе приведенных выше примеров данных:

enter image description here

Если вы используете это в качестве набора данныхВ запросе в SSRS вы можете затем добавить матрицу с Группой строк для сотрудника и Группой столбцов для продукта, значения «ячейки» будут =SUM(Fields!Qty.Value)

. Это даст вам отчет, который выглядит следующим образом ..(простите за форматирование, это буквально 2 минуты работы)

enter image description here

2 голосов
/ 30 апреля 2019

Вы можете использовать элемент управления tablix в SSRS, чтобы сделать это, используя ваш запрос.Хотя вы должны изменить свое объединение для таблицы Employee в запросе на внешнее объединение, чтобы убедиться, что они все еще отображаются в тех случаях, когда у них не было продаж.Вы бы использовали группировку строк и столбцов в таблице.Группа столбцов в основном сделает для вас поворот, создавая столбцы для каждого уникального значения, по которому вы группируете.Группа строк создаст строку для каждого уникального значения, по которому она группируется.Перейдите по следующей ссылке, чтобы получить дополнительную информацию об использовании групп в SSRS

Общие сведения о группах (построитель отчетов и SSRS)

...