返回同一行中的多个项目(SQL)

时间:2015-10-28 23:59:37

标签: mysql sql

我正在使用此处的问题练习我的SQL:http://sqlzoo.net/wiki/AdventureWorks_hard_questions

我遇到第一个问题。我会在这里重新发布,所以你不必点击链接。

  

对于在达拉斯拥有“主办公室”的每位客户,请显示“主办公室”的AddressLine1和“送货”地址的地址1 - 如果没有送货地址,请将其留空。每个客户使用一行。

涉及的表是CustomerAW(CustomerID为PKey,我认为是唯一相关的字段),CustomerAddress(包含项目CustomerID,AddressID和AddressType)和地址(AddressID,AddressLine1和City是相关字段)。

我现在拥有的是:

public class MyCodeCracker {
    private int encry;

    public MyCodeCracker(int encry) {
        this.encry = encry;
    }

    public String encrypt(String text) {
        // use encry to do encrytion
        return "";  // return encrypted text
    }

    public String decrypt(String encryptedText) {
        // use encry to translate encryptedText to text
        return ""; // return text
    }

    public int getEncry() {
        return encry;
    }

    public static void main(String[] args) {
        // here get user input
        // extract out the encryption int
        // create MyCodeCracker with the int
        // and then encrypt and decrypt text as needed
    }

}

但我不知道如何将送货地址输入第二栏。

1 个答案:

答案 0 :(得分:0)

需要某种字段来识别主地址中的哪个地址,哪个是发货地址。假设你有这样一个领域,那么有几种不同的方法可以做到这一点。这是一个有条件聚合的人:

select c.customerid,
    max(case when ca.addresstype = 'Main' then a.addressline1 end) as main, 
    max(case when ca.addresstype = 'Ship' then a.addressline1 end) as ship 
from customeraw c  
    join customeraddress ca on c.customerid = ca.customerid
    join address a on ca.addressid = a.addressid
group by c.customerid
having max(case when ca.addresstype = 'Main' then a.city end) = 'Dallas'

另一个选择是多次加入address表 - 一个用于主办公室,另一个用于运送:

select c.customerid,
    a.addressline1 as main,
    a2.addressline1 as ship
from customeraw c  
    join customeraddress ca on c.customerid = ca.customerid
    join address a on ca.addressid = a.addressid and ca.addresstype = 'Main'
    join address a2 on ca.addressid = a2.addressid and ca.addresstype = 'Ship'
where a.City = 'Dallas'

使用此选项,您可能需要使用outer join作为送货地址,具体取决于所需的结果。