SQL Server 2014:销售产品按每个员工计数

时间:2019-04-30 13:19:35

标签: sql sql-server reporting-services pivot

我有一个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 个答案:

答案 0 :(得分:2)

您可以使用设计的查询在SSRS中使用tablix控件来执行此操作。尽管您应该在查询中将对Employee表的联接更改为外部联接,以确保它们在没有销售的情况下仍然显示。您将在tablix中同时使用行和列分组。基本上,列组将通过为要分组的每个唯一值创建列来为您做一个枢轴。行组将为其分组的每个唯一值创建一行。请查看以下链接,以获取有关在SSRS中使用组的更多信息

Understanding Groups (Report Builder and SSRS)

答案 1 :(得分:2)

如果您在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