我需要创建一个SSIS包,向我提供工作人员(承包商/公司)的数量。
来自SQL Server数据库的输入表:
我需要计算特定日期+工位+工作类型+帐号的承包商和公司的订单数。
我的输出应如下所示。
有人可以帮助我如何创建一个程序包以获得所需的输出吗?
答案 0 :(得分:1)
由于数据在表中,因此您可以要求数据库引擎执行计算逻辑。
我创建了一个临时表,并使用提供的数据填充了该表。
CREATE TABLE
#Source
(
[Date] date
, Station char(3)
, worktype char(2)
, Accountno varchar(10)
, workdoneby varchar(10)
)
INSERT INTO
#Source
(
Date
, Station
, worktype
, Accountno
, workdoneby
)
VALUES
('2018-06-24', 'RMS', 'RH', 'I.145.001', 'Company')
, ('2018-06-24', 'RMS', 'PH', 'I.145.001', 'Contractor')
, ('2018-06-24', 'RMS', 'PH', 'I.145.002', 'Company')
, ('2018-06-24', 'RMS', 'PH', 'I.145.002', 'Contractor');
现在让我们查询!我发现将这些问题分解成小块是有帮助的。我要做的第一件事是将workdoneby
列分为1或0的两列
SELECT
S.Date
, S.Station
, S.worktype
, S.Accountno
, CASE S.workdoneby
WHEN 'Contractor' THEN 1
ELSE 0
END AS contractorCount
, CASE S.workdoneby
WHEN 'Company' THEN 1
ELSE 0
END AS companyCount
FROM
#Source AS S
运行该命令,让我看一下结果,看看仍然有4行,并且得到了正确的实体计数。
下一步是折叠/汇总/汇总这些值。您表示我们应该按日期/工位/工作类型/帐户编号分组,这正是我们要做的。
如果我采用第一个查询并使其成为派生表,则发现调试起来更容易,因此基本形式现在变成SELECT * FROM (ORIGINAL QUERY HERE) AS D
SELECT
D.Date
, D.Station
, D.worktype
, D.Accountno
, D.contractorCount
, D.companyCount
FROM
(
SELECT
S.Date
, S.Station
, S.worktype
, S.Accountno
, CASE S.workdoneby
WHEN 'Contractor' THEN 1
ELSE 0
END AS contractorCount
, CASE S.workdoneby
WHEN 'Company' THEN 1
ELSE 0
END AS companyCount
FROM
#Source AS S
) D
现在您可以看到它给出了相同的原始结果,我们将在ContractorCount和companyCount列上使用SUM
函数,并在日期/站点/工作类型/帐户编号上使用GROUP BY
SELECT
D.Date
, D.Station
, D.worktype
, D.Accountno
, SUM(D.contractorCount) AS contractor
, SUM(D.companyCount) AS company
FROM
(
SELECT
S.Date
, S.Station
, S.worktype
, S.Accountno
, CASE S.workdoneby
WHEN 'Contractor' THEN 1
ELSE 0
END AS contractorCount
, CASE S.workdoneby
WHEN 'Company' THEN 1
ELSE 0
END AS companyCount
FROM
#Source AS S
) D
GROUP BY
D.Date
, D.Station
, D.worktype
, D.Accountno;
现在,我们的数据看起来像预期的那样,在SSIS中,您需要对其进行处理。您的问题未指定您需要做的 ,但是您可能会使用Data Flow Task
将这些汇总数据从一个地方推送到另一个目的地(不同的服务器,Excel等) ),或者将这些数据推送到同一服务器上的表中,在这种情况下,您将使用Execute SQL Task