连接两个表并根据一列中的值生成两列(pivot)



我有两个表,名为Account表和Product表。

两个表格的记录如下:

账户表:

Id
1
2
3
4

产品表:

account_id  date  product
1           2015    A
1           2016    B
2           2012    B
2           2013    A
3           2017    A

预期结果:

id     isA    isB
1      Yes    No
2      Yes    Yes
3      No     No

我想得到示例中所示的给定谓词(日期)(小于2016)的结果(乘积为列)。如果id不存在任何产品,或者不满足日期条件,则该产品列的值为"否"。例如,对于account_id=3,日期是2017,这与我们的谓词不匹配,因此isA的值是No。类似地,对于accountid=3,我们没有产品B条目。所以isB列也应该有No值。

目前,我得到了两个ID的记录,这两个产品都有条目。有没有办法以某种方式合并这些行。

显然,您可以从产品表中获得所需的所有数据;不需要accounts表。按帐号分组,看看是否有匹配项。

SELECT 
  account_id,
  MAX(CASE WHEN product = 'A' AND date < 2016 THEN 'yes' ELSE 'no' END) AS isa,
  MAX(CASE WHEN product = 'B' AND date < 2016 THEN 'yes' ELSE 'no' END) AS isb
  FROM product
GROUP BY account_id;

要完成@Thorsten Kettner的回答,需要另一个CASE
假设您想显示"zNo"字而不是"no"字,在这种情况下,MAX函数不会返回正确的结果。

SELECT 
  account_id,
  CASE WHEN(MAX(CASE WHEN product = 'A' AND DATE < 2016 THEN 1 ELSE 0 END) = 1) THEN 'Yes' ELSE 'No' END as isA,
  CASE WHEN(MAX(CASE WHEN product = 'B' AND DATE < 2016 THEN 1 ELSE 0 END) = 1) THEN 'Yes' ELSE 'No' END as isB
FROM Product
GROUP BY account_id

最新更新