【问题标题】:SQL Combine data from two different date ranges into one result setSQL 将来自两个不同日期范围的数据合并到一个结果集中
【发布时间】:2023-03-18 14:58:01
【问题描述】:

使用 SqlServer 2008,我有一个临时表 (#tmpAllSales),它记录了一年的所有销售额。我想创建一个 SELECT 语句,其中包含当年的销售额以及上一季度的销售额。

类似这样的事情(@StartDate 和 @EndDate 被定义为一个季度的开始/结束):

--QTD Sales By Company
SELECT
    Company,
    SUM(Call) as TotalCallsQTD,
    SUM(Call) - SUM(SoldCall) as FreeCallsQTD,
    SUM(SalableCall) as SalesRelatedCallsQTD,
    SUM(SoldCall) as SoldCallsQTD
FROM
    #tmpAllSales
WHERE
    CalledOn between @StartDate and @EndDate
GROUP BY
    Company

--COMBINED WITH BASED ON Company

--YTD Sales By Company
SELECT
    Company,
    SUM(Call) as TotalCallsYTD,
    SUM(Call) - SUM(SoldCall) as FreeCallsYTD,
    SUM(SalableCall) as SalesRelatedCallsYTD,
    SUM(SoldCall) as SoldCallsYTD
FROM
    #tmpAllSales
GROUP BY
    Company
ORDER BY
    Company

每个单独的查询都会给出我想要的结果,但我不知道如何组合成一个结果集。

编辑

我在原始帖子中没有明确表示我希望在每家公司的一行中获得所有结果。我在 Excel 宏中使用它,所以如果所有信息都在一行上,那就太好了。

【问题讨论】:

    标签: sql-server-2008


    【解决方案1】:
    SELECT
        Period = 'QTD',
        Company,
        SUM(Call) as TotalCallsQTD,
        SUM(Call) - SUM(SoldCall) as FreeCallsQTD,
        SUM(SalableCall) as SalesRelatedCallsQTD,
        SUM(SoldCall) as SoldCallsQTD
    FROM
        #tmpAllSales
    WHERE
        CalledOn between @StartDate and @EndDate
    GROUP BY
        Company
    UNION ALL
    SELECT
        Period = 'YTD',
        Company,
        SUM(Call) as TotalCallsYTD,
        SUM(Call) - SUM(SoldCall) as FreeCallsYTD,
        SUM(SalableCall) as SalesRelatedCallsYTD,
        SUM(SoldCall) as SoldCallsYTD
    FROM
        #tmpAllSales
    GROUP BY
        Company
    ORDER BY
        Period, Company;
    

    如果您希望它们作为每个公司的单行,那么:

    ;WITH q AS
    (
        SELECT
            Company,
            SUM(Call) as TotalCallsQTD,
            SUM(Call) - SUM(SoldCall) as FreeCallsQTD,
            SUM(SalableCall) as SalesRelatedCallsQTD,
            SUM(SoldCall) as SoldCallsQTD
        FROM
            #tmpAllSales
        WHERE
            CalledOn between @StartDate and @EndDate
        GROUP BY
            Company
    ), y AS 
    (
        SELECT
            Company,
            SUM(Call) as TotalCallsYTD,
            SUM(Call) - SUM(SoldCall) as FreeCallsYTD,
            SUM(SalableCall) as SalesRelatedCallsYTD,
            SUM(SoldCall) as SoldCallsYTD
        FROM
            #tmpAllSales
        GROUP BY
            Company
    )
    SELECT q.Company, qTotalCallsYTD = q.TotalCallsYTD, etc...,
        yTotalCallsYTD = y.TotalCallsYTD, etc...
    FROM q INNER JOIN y
    ON q.Company = y.Company
    ORDER BY q.Company;
    

    【讨论】:

    • 这行得通,但我没有想到我会得到的结果。这为每个公司提供了两行 YTD 和 QTD 一行。有没有办法将每个公司的数据与所有列组合成一行(即公司、TotalCallsQTD、FreeCallsQTD、SalesRelatedCallsQTD、SoldCallsQTD、TotalCallsYTD、FreeCallsYTD、SalesRelatedCallsYTD、SoldCallsYTD)。我在 Excel 宏中使用它,所以如果每家公司的所有内容都在一行中,这将有很大帮助。
    • 我对这个解决方案投了赞成票,因为它确实回答了问题,但没有得到我想要的结果。
    • 非常好,就像一个魅力!感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2012-12-16
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多