我需要从下面的表格中提取数据(表格有更多的列)。我在 sas 中使用 proc sql,例如。
代码 | 组件 | POLICY_STATUS_ID_31_12 | PRODUCT_ID | INVOICE_21_01 | INVOICE_21_02 |
---|---|---|---|---|---|
7456823769020 | DLB | E | C511999 | 34.01 | 18.28 |
7456823769020 | DLB | W | C511999 | 43.23 | 27.21 |
7456823769030 | 美联储 | E | C611000 | 34.01 | 18.28 |
7468237600467 | 美联储 | W | C611001 | 43.23 | 27.21 |
7468353769540 | BLB | W | C611001 | 9.08 | 80.12 |
7567853745500 | 美联储 | W | C511002 | 3.34 | 92.01 |
8546423765600 | 提示 | E | C511002 | 78.99 | 78.10 |
8546423765600 | 提示 | w | C511002 | 78.99 | 78.10 |
我需要知道具有相同 product_id 但同时具有 W 和 E 的 policy_status_code_31_12 的代码数量和发票金额。(只需查看前 2 行,它们具有相同的代码,但是不同的 policy_status_id_31_12) 我为名为 component 的列的特定值执行此操作。
我认为我应该使用 have 子句,但我不确定。 我认为它在
select code, product_id, policy_status_code_31_12, component, sum(invoice_20_01), sum(invoice_20_02)
from table1
where component in ('DLB','FED','TIP')
group by code, product_id, policy_status_code_31_12, component
;
不过,我想我错过了......有人可以帮助我吗?我想获得这样的东西......一个结果显示那些具有相同代码、相同contract_code、相同product_id但不同policy_status_id_31_12的记录,以及发票值。
感谢帮助
代码 | 组件 | POLICY_STATUS_ID_31_12 | PRODUCT_ID | INVOICE_21_01 | INVOICE_21_02 |
---|---|---|---|---|---|
7456823769020 | DLB | E | C511999 | 34.01 | 18.28 |
7456823769020 | DLB | W | C511999 | 43.23 | 27.21 |
8546423765600 | 提示 | E | C511002 | 78.99 | 78.10 |
8546423765600 | 提示 | W | C511002 | 78.99 | 78.10 |
答案 0 :(得分:1)
Having Clause 仅用于像 HAVING SUM(col)>0
这样的聚合。您可以使用 WHERE
子句。
改题后更新答案
SELECT code,product_id, policy_status_code_31_12, SUM(invoice_20_01), SUM(invoice_20_02)
FROM table1
WHERE component IN ('DLB','FED','TIP') AND policy_status_code_31_12 IN ('W','E')
GROUP BY code,product_id,policy_status_code_31_12
答案 1 :(得分:1)
以下是您问题的数据在 fiddle 中。
我在表格中添加了一些行,因为我不完全清楚您的要求。第一个额外的行包含“N”,其他行包含“E”或“W”。第二个添加与另一个“E”行匹配的“W”行。最后一行将另一个 'E' 记录添加到同时具有 'E' 和 'W' 的记录
7456823769020 DLB N C511999 12.34 43.21
7456823769030 FED W C611000 34.56 98.76
8546423765600 TIP E C511002 98.77 65.43
此查询汇总了您的表格条目,但不会按“E”和“W”进行过滤
select code, product_id,
group_concat(policy_status_id_31_12
ORDER BY policy_status_id_31_12) statuses,
component,
sum(invoice_21_01) sum1, sum(invoice_21_02) sum2
from table1
where component in ('DLB','FED','TIP')
group by code, product_id, component;
它产生这个结果集。
代码 | product_id | 组件 | 状态 | sum1 | sum2 |
---|---|---|---|---|---|
7456823769020 | C511999 | DLB | E、N、W | 89.58 | 88.70 |
7456823769030 | C611000 | 美联储 | E,W | 68.57 | 117.04 |
7468237600467 | C611001 | 美联储 | W | 43.23 | 27.21 |
7567853745500 | C511002 | 美联储 | W | 3.34 | 92.01 |
8546423765600 | C511002 | 提示 | E,E,W | 256.75 | 221.63 |
现在,从您的问题中可以清楚地看出,您希望过滤结果集中的这些行中的第二行:它同时具有“E”和“W”状态。很明显你不想要第三行和第四行。
但我无法从你的问题中看出你想对第一行和最后一行做什么。
如果您想简单地忽略 'N' 状态并获取包含 'E' 和 'W' 各一个的行,您可以这样做。 (https://www.db-fiddle.com/f/kaucwJw7wAjWBpSFTpTpxU/5)
select code, product_id,
group_concat(policy_status_id_31_12
ORDER BY policy_status_id_31_12) statuses,
component,
sum(invoice_21_01) sum1, sum(invoice_21_02) sum2
from table1
where component in ('DLB','FED','TIP')
and policy_status_id_31_12 IN ('E', 'W')
group by code, product_id, component
having COUNT(*) = 2
如果您想按包含 恰好一个 'E' 和 'W' 的行进行过滤,但仍然在您的总和中包含 'N',您可以这样做。 (https://www.db-fiddle.com/f/kaucwJw7wAjWBpSFTpTpxU/6)
select code, product_id,
group_concat(policy_status_id_31_12
ORDER BY policy_status_id_31_12) statuses,
component,
sum(invoice_21_01) sum1, sum(invoice_21_02) sum2
from table1
where component in ('DLB','FED','TIP')
group by code, product_id, component
having SUM(policy_status_id_31_12 = 'E') = 1
and SUM(policy_status_id_31_12 = 'W') = 1
如果您想按包含至少一个 'E' 和 'W' 但没有其他行的行过滤,您可以这样做 (https://www.db-fiddle.com/f/kaucwJw7wAjWBpSFTpTpxU/8)
select code, product_id,
group_concat(policy_status_id_31_12
ORDER BY policy_status_id_31_12) statuses,
component,
sum(invoice_21_01) sum1, sum(invoice_21_02) sum2
from table1
where component in ('DLB','FED','TIP')
group by code, product_id, component
having SUM(policy_status_id_31_12 = 'E') >= 1
and SUM(policy_status_id_31_12 = 'W') >= 1
and SUM(policy_status_id_31_12 NOT IN('E', 'W')) = 0
HAVING SUM()
模式可以帮助您做到这一点。