SSIS包-基于多个列的计数

时间:2018-06-29 03:30:35

标签: ssis

我需要创建一个SSIS包,向我提供工作人员(承包商/公司)的数量。

来自SQL Server数据库的输入表:

enter image description here

我需要计算特定日期+工位+工作类型+帐号的承包商和公司的订单数。

我的输出应如下所示。

enter image description here

有人可以帮助我如何创建一个程序包以获得所需的输出吗?

1 个答案:

答案 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

现在,我们的数据看起来像预期的那样,在SSIS中,您需要对其进行处理。您的问题未指定您需要做的 ,但是您可能会使用Data Flow Task将这些汇总数据从一个地方推送到另一个目的地(不同的服务器,Excel等) ),或者将这些数据推送到同一服务器上的表中,在这种情况下,您将使用Execute SQL Task