显示不同记录的查询

时间:2021-03-16 09:57:19

标签: sql database sas

我需要从下面的表格中提取数据(表格有更多的列)。我在 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

2 个答案:

答案 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() 模式可以帮助您做到这一点。