【问题标题】:join two tables and generate two columns(pivot) depending on value in one column连接两个表并根据一列中的值生成两列(枢轴)
【发布时间】:2016-03-29 03:06:58
【问题描述】:

我有两个表,分别命名为 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。同样,对于 account_id=3,我们没有产品 B 条目。所以 isB 列也应该没有值。

目前,我得到了两条 id 记录,其中包含两种产品的条目。 有没有办法以某种方式合并这些行。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

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

    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;
    

    【讨论】:

    【解决方案2】:

    要完成 @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
    

    【讨论】:

    • 你错了,这不是必需的。 MAX('no','no','no') = 'no'MAX('no','yes','no') = 'yes'。但你的方法也是有效的,有些人甚至会觉得它更容易阅读。
    • 那么如果你想显示'zNo'而不是'No',应该考虑哪种方法?
    • 然后MIN(CASE WHEN product = 'A' AND date &lt; 2016 THEN 'yes' ELSE 'no' END) AS isa。 (与德语中的 'ja' 和 'nein' 相同。)
    • :-) 嗯,是的,这行得通,但我认为这不是一般的方法。
    • 我很确定所有包含拉丁字符的排序规则在 'zno' 之前的 'yes' 之前排序 'no',但是是的,可能存在某些语言的边界情况,其中某些字符组合在其他地方排序(像西班牙语中的 'ch' 和 'll')。所以是的,如果您碰巧使用语言设置运行我的查询,其中“否”被视为“y”之后的特殊字符,但您仍然希望看到英文“yes”和“no”而不是它们的翻译,那么查询将失败。我怀疑这种语言是否存在,但这是可能的,因此您的数字方法更安全。
    猜你喜欢
    • 2021-01-14
    • 2017-11-02
    • 2019-12-19
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多