如何计算具有不同条件的同一列的不同值的百分比
How to calculate a percentage on different values from same column with different criteria
我正在尝试在 SSRS 中编写一个查询(使用 SQL)来计算每个月的损益表销售额百分比(年份是用户在运行时选择的参数)。但是,我必须用于数据的 table 列出了所有年、月、帐户、美元等,看起来像这样:
ACCT_YEAR
ACCT_PERIOD
ACCOUNT_ID
CREDIT_AMOUNT
2021
1
4000
20000
2021
2
4000
25000
2021
1
5000
5000
2021
2
5000
7500
2021
1
6000
4000
2021
2
6000
8000
等等,等等(ACCOUNT_ID =4000恰好是销售账号)
举个例子,
我需要计算
CREDIT_AMOUNT when ACCT_YEAR = 2021, ACCT_PERIOD=1, and ACCOUNT_ID=5000
/
CREDIT_AMOUNT when ACCT_YEAR = 2021, ACCT_PERIOD=1, and ACCOUNT_ID=4000
* 100
然后我会为 ACCT_YEAR 中的每个 ACCT_PERIOD 执行此操作。
希望这是有道理的...我想要的是这样的:
ACCT_YEAR
ACCT_PERIOD
ACCOUNT_ID
PERCENTAGE
2021
1
5000
0.25
2021
2
5000
0.30
2021
1
6000
0.20
2021
2
6000
0.32
我正在尝试创建一个图表来显示大约 10 个不同帐户的销售额百分比(我知道他们的特定 account_ID 并将按这些 ID 进行过滤)并使用折线图小部件来按月显示趋势。
我尝试过 CASE 场景、OVER 场景和嵌套子查询。我觉得这应该很简单,但我很冷静,没有看到明显的解决方案。
有什么建议么?
谢谢!
您只需为 ACCT_YEAR 使用父列组和 ACCT_PERIOD 的子列组的矩阵。然后你可以使用你的计算。如果将文本框格式化为百分比,则不需要将其乘以 100。
文本框值:=IIF(ACCOUNT_ID=4000, Sum(CREDIT_AMOUNT), 0) = 0, 0, IIF(ACCOUNT_ID=5000, Sum(CREDIT_AMOUNT), 0) / IIF(ACCOUNT_ID=4000, Sum(CREDIT_AMOUNT), 0)
需要注意的一个重要行为是 window 函数在 where 子句之后应用。
因为您需要在 之前应用 window 函数 任何 where 子句 (这将filter account 4000 out),它们需要在一个范围内使用,where子句在另一个范围内使用。
WITH
perc AS
(
SELECT
*,
credit_amount * 100.0
/
SUM(
CASE WHEN account_id = 4000 THEN credit_amount END
)
OVER (
PARTITION BY acct_year, accr_period
)
AS credit_percentage
FROM
your_table
)
SELECT
*
FROM
perc
WHERE
account_id IN (5000,6000)
我正在尝试在 SSRS 中编写一个查询(使用 SQL)来计算每个月的损益表销售额百分比(年份是用户在运行时选择的参数)。但是,我必须用于数据的 table 列出了所有年、月、帐户、美元等,看起来像这样:
ACCT_YEAR | ACCT_PERIOD | ACCOUNT_ID | CREDIT_AMOUNT |
---|---|---|---|
2021 | 1 | 4000 | 20000 |
2021 | 2 | 4000 | 25000 |
2021 | 1 | 5000 | 5000 |
2021 | 2 | 5000 | 7500 |
2021 | 1 | 6000 | 4000 |
2021 | 2 | 6000 | 8000 |
等等,等等(ACCOUNT_ID =4000恰好是销售账号)
举个例子, 我需要计算
CREDIT_AMOUNT when ACCT_YEAR = 2021, ACCT_PERIOD=1, and ACCOUNT_ID=5000
/
CREDIT_AMOUNT when ACCT_YEAR = 2021, ACCT_PERIOD=1, and ACCOUNT_ID=4000
* 100
然后我会为 ACCT_YEAR 中的每个 ACCT_PERIOD 执行此操作。 希望这是有道理的...我想要的是这样的:
ACCT_YEAR | ACCT_PERIOD | ACCOUNT_ID | PERCENTAGE |
---|---|---|---|
2021 | 1 | 5000 | 0.25 |
2021 | 2 | 5000 | 0.30 |
2021 | 1 | 6000 | 0.20 |
2021 | 2 | 6000 | 0.32 |
我正在尝试创建一个图表来显示大约 10 个不同帐户的销售额百分比(我知道他们的特定 account_ID 并将按这些 ID 进行过滤)并使用折线图小部件来按月显示趋势。
我尝试过 CASE 场景、OVER 场景和嵌套子查询。我觉得这应该很简单,但我很冷静,没有看到明显的解决方案。
有什么建议么?
谢谢!
您只需为 ACCT_YEAR 使用父列组和 ACCT_PERIOD 的子列组的矩阵。然后你可以使用你的计算。如果将文本框格式化为百分比,则不需要将其乘以 100。
文本框值:=IIF(ACCOUNT_ID=4000, Sum(CREDIT_AMOUNT), 0) = 0, 0, IIF(ACCOUNT_ID=5000, Sum(CREDIT_AMOUNT), 0) / IIF(ACCOUNT_ID=4000, Sum(CREDIT_AMOUNT), 0)
需要注意的一个重要行为是 window 函数在 where 子句之后应用。
因为您需要在 之前应用 window 函数 任何 where 子句 (这将filter account 4000 out),它们需要在一个范围内使用,where子句在另一个范围内使用。
WITH
perc AS
(
SELECT
*,
credit_amount * 100.0
/
SUM(
CASE WHEN account_id = 4000 THEN credit_amount END
)
OVER (
PARTITION BY acct_year, accr_period
)
AS credit_percentage
FROM
your_table
)
SELECT
*
FROM
perc
WHERE
account_id IN (5000,6000)