Sql server 连接两个表并根据一列中的值生成两列(透视)

Sql server 连接两个表并根据一列中的值生成两列(透视),sql-server,tsql,Sql Server,Tsql,我有两个表,分别是say 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 Y

我有两个表,分别是say 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或不满足日期条件,则该产品列将具有“否”值。例如,对于账户_id=3,日期为2017年,这与我们的谓词不匹配,因此isA的值为否。同样,对于账户_id=3,我们没有产品B条目。所以isB列也应该没有值

目前,我得到两个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;
选择
帐户id,
最大值(当产品为“A”且日期小于2016年时,则为“是”或“否”结束)作为isa,
最大值(当产品为“B”且日期小于2016年时,则为“是”或“否”结束)为isb
从产品
按帐户id分组;
要完成@Thorsten Kettner的回答,需要另一个
案例。

假设您想显示'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
选择
帐户id,
案例时间(最大值(当产品='A'和日期<2016年时,则1其他0结束)=1)然后“是”其他“否”作为isA结束,
案例时间(最大值(当产品='B'且日期<2016年,则1其他0结束)=1)然后“是”其他“否”结束为isB
从产品
按帐户\u id分组

嗨,Thorsten,谢谢你的解决方案。为了更好地理解字符串上的聚合函数,我也进行了检查<代码>最大值('no','no','no')='no'
MAX('no','yes','no')='yes'
。但是你的方法也是有效的,有些人甚至会觉得它更容易阅读。因此,如果你想显示'zNo'而不是'No',应该考虑哪种方法?然后将
MIN(当product='A'和date<2016时,则为'yes'或'No'结束)作为isa
。(与德语中的“ja”和“nein”相同。):-)嗯,是的,这是可行的,但我认为这不是一种通用的方法。我非常确定,所有包含拉丁字符的排序规则在“zno”之前的“Yes”之前都是“no”,但是的,在某些语言中,某些字符组合可能会在其他地方排序(像西班牙语中的“ch”和“ll”)。因此,是的,如果您碰巧在语言设置中运行我的查询,其中“否”被视为“y”后面的特殊字符,但您仍然希望看到英文的“是”和“否”,而不是它们的翻译,那么查询将失败。我怀疑这种语言是否存在,但这是可能的,因此您的数字方法更安全一些。