sql-server - 将每位客户的销售额与去年的销售额进行比较
问题描述
我有 2 个查询,我使用 UNION 来比较 2 年内每位客户的销售价值。下面返回 2 列,一列用于组织,一列用于销售价值/客户。但是 2 年的拆分行不通。似乎将所有值都拉到一列中,而不是 2018 年的列和 2019 年的列。也许我应该使用连接或子查询?
返回结果类似于:
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
子句中使用表别名确实使查询更短且更易于阅读
我更改了日期过滤的实现,因此表列上没有使用日期函数(这使查询更有效)
推荐阅读
- ml.net - ML.NET 如何使输入模型通用?
- ruby-on-rails - 如何根据规范更改 Rails 应用程序配置?
- c# - 如何在 C# 中获取 Outlook 投票按钮的结果
- powerbi - Power bi 计算比率
- node.js - 在 Docker 文件中访问 docker compose arm 变量
- javascript - 对对象进行配对 javascript
- .net - Azure DevOps nuget 工件延迟
- javascript - 反应将页脚背景从黑色更改为全高图像不起作用
- xml - SAP 的 XML(ATOM)问题使用 XSL 在 HTML 表中显示多个属性(在同一元素内)
- python - 在python中使用数组Y中每个元素的一定数量的副本创建数组X