根据一列

时间:2016-03-28 17:23:30

标签: sql-server tsql

我有两个名为Account table和Product table的表。

下表给出了两个表的记录:

帐户表:

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)。 如果身份证不存在任何产品或者不满足日期条件,那么它将具有“不”。该产品列的值。例如,对于account_id = 3,日期是2017,它与我们的谓词不匹配,因此isA的值是否。同样,对于account_id = 3,我们没有产品B条目。所以isB列也应该没有值。

目前我正在获取两个产品的两个记录的ID记录。 有没有办法以某种方式合并这些行。

2 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:0)

要完成 @Thorsten Kettner 的回答,需要另一个CASE
假设您想要显示&#39; zNo&#39;单词而不是&#39; no&#39;单词,在这种情况下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