首页 > 解决方案 > SSIS 包 - 基于多列的计数

问题描述

我需要创建一个 SSIS 包,为我提供 workdoneby(承包商/公司)的计数。

来自 sql server db 的输入表:

在此处输入图像描述

我需要计算承包商和公司在特定日期 + 站点 + 工作类型 + accountno 的订单数量。

我的输出应该是这样的。

在此处输入图像描述

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

标签: ssis

解决方案


由于数据在表中,您可以要求数据库引擎进行计算逻辑。

设置

我创建了一个临时表并用提供的数据填充它。

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

现在您可以看到它给出了相同的原始结果,我们将SUM在contractorCount 和companyCount 列以及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 中您需要对其进行处理。您的问题没有指定您需要做什么,但您可能会使用 aData Flow Task这些聚合数据从一个地方推送到另一个目的地(不同的服务器、Excel 等),或者您要将此数据推送到在同一台服务器上的表,在这种情况下,您将使用Execute SQL Task


推荐阅读