将每个客户的销售额与去年的销售额进行比较

Compare Sales with last year sales per customer

我有 2 个查询,我使用 UNION 来比较 2 年内每个客户的销售价值。下面 return 有 2 列,一列用于组织,一列用于销售 value/customer。但是 2 年的拆分是行不通的。它似乎将所有值都拉到一列中,而不是将 2018 年的一列和 2019 年的一列。也许我应该使用连接或子查询?

return 结果类似于:

Organization    Last Year      Previous year
CUS                 12000        160000
etc
SELECT Top 25
    FORMAT(SUM(dbo.ARInvoices.arpFullInvoiceSubtotalBase), 'C2') AS "previousyear ", dbo.Organizations.cmoOrganizationID AS "Organization"
FROM (dbo.ARInvoices
LEFT OUTER JOIN dbo.Organizations ON dbo.ARInvoices.arpCustomerOrganizationID = dbo.Organizations.cmoOrganizationID)  
WHERE  YEAR(arpInvoiceDate) = year(DATEADD(year, -2, getdate()))AND arpInvoiceType = 1
GROUP BY dbo.Organizations.cmoOrganizationID

UNION

SELECT Top 25
    FORMAT(SUM(dbo.ARInvoices.arpFullInvoiceSubtotalBase), 'C2') AS "Lastyear", dbo.Organizations.cmoOrganizationID AS "Organization"
FROM (dbo.ARInvoices
LEFT OUTER JOIN dbo.Organizations ON dbo.ARInvoices.arpCustomerOrganizationID = dbo.Organizations.cmoOrganizationID)   
WHERE  YEAR(arpInvoiceDate) = year(DATEADD(year, -1, getdate()))AND arpInvoiceType = 1
GROUP BY dbo.Organizations.cmoOrganizationID'

您可以进行条件聚合

select
    sum(case 
        when arpInvoiceDate >= datefromparts(year(getdate()) - 2, 1, 1) 
             and arpInvoiceDate < datefromparts(year(getdate()) - 1, 1, 1) 
        then i.arpFullInvoiceSubtotalBase
    end) as previousYear,
    sum(case 
        when arpInvoiceDate >= datefromparts(year(getdate()) - 1, 1, 1)
        then i.arpFullInvoiceSubtotalBase
    end) as lastYear
from dbo.ARInvoices i 
inner join dbo.Organizations o ON i.arpCustomerOrganizationID = o.cmoOrganizationID
where arpInvoiceType = 1 and arpInvoiceDate >= datefromparts(year(getdate()) - 2, 1, 1)
group by o.cmoOrganizationID

备注:

  • 我使用 INNER JOIN 而不是 LEFT JOIN,因为 GROUP BY 子句中使用了左侧的一列 table [=14] =]

  • table 别名确实使查询更短,更易于阅读

  • 我更改了日期过滤的实现,因此 table 列上没有使用日期函数(这使查询更有效率)