我正在开发一个sql查询,用于在windows mobile手机上的sql server compact edition 3.5中使用。我需要从三个表中取回一个结果集。
我并不完全记得所有的列名,因为我在家里问这个问题,但这是我正在处理的表的一个很好的例子。
Table 1: Customers
Table 2: PresoldOrders
Table 3: CustomerDetails
*
________________________________________
| |
|--------------- Customers --------------|
|________________________________________|
| |
| PK int CustomerNumber |
| varchar(125) FirstName |
| varchar(125) LastName |
| varchar(125) Email |
| varchar(200) Address1 |
| varchar(200) Address2 |
| varchar(200) City |
| varchar(2) State |
| varchar(5) Zip |
|________________________________________|
*
________________________________________
| |
|------------ CustomerDetails -----------|
|________________________________________|
| |
| PK int CustomerDetailsId |
| FK int CustomerNumber |
| varchar(255) FieldName |
| varchar(255) FieldValue |
|________________________________________|
*
________________________________________
| |
|------------ PresoldOrders -------------|
|________________________________________|
| |
| PK int PresoldOrderId |
| FK int CustomerNumber |
| int OrderNumber |
| int RouteStopNumber |
| datetime DeliveryDate |
| varchar(100) Other1 |
| varchar(100) Other2 |
|________________________________________|
现在,查询应该返回客户中存在的所有记录,即使它们在“PresoldOrderHeaders”表中不存在。这部分非常简单,我打算只使用左外连接。查询的第二部分有点复杂。
这是我到目前为止构建的查询。
SELECT c.CustomerNumber
c.FirstName
c.LastName
c.Email
c.Address1
c.Address2
c.City
c.State
c.Zip
po.OrderNumber
po.DeliveryDate
po.Other1
po.Other2
FROM Customer c
LEFT OUTER JOIN PresoldOrders po on c.CustomerNumber = po.CustomerNumber
ORDER BY po.RouteStopNumber;
Tricky part是CustomerDetails表。以下是一些数据的示例
_________________________________________________________
| | | | |
| PK | CustomerNumber | FieldName | FieldValue |
|-------|-----------------|--------------|----------------|
| 1 | 1 | A | 125 |
|-------|-----------------|--------------|----------------|
| 2 | 1 | B | 126 |
|-------|-----------------|--------------|----------------|
| 3 | 1 | C | 127 |
|-------|-----------------|--------------|----------------|
| 4 | 2 | A | 138 |
|-------|-----------------|--------------|----------------|
| 5 | 2 | B | 140 |
|-------|-----------------|--------------|----------------|
| 6 | 2 | C | 143 |
|-------|-----------------|--------------|----------------|
|_________________________________________________________|
对于我将在Component One Flex Grid中显示的信息,CustomerDetails表中列出的FieldName将被修复。
我希望存档:
_____________________________________________________________________________________________________________________
| | | | | | | |
| CustomerNumber | FirstName | LastName | ... | FieldName A's value | FieldName B's Value | FieldName C's Value |
|-----------------|-----------|----------|-----|---------------------|---------------------|--------------------------|
| 1 | John | Someone | ... | 125 | 126 | 127 |
|-----------------|-----------|----------|-----|---------------------|---------------------|--------------------------|
| 2 | Dan | Other | ... | 138 | 140 | 143 |
|-----------------|-----------|----------|-----|---------------------|---------------------|--------------------------|
|_____________________________________________________________________________________________________________________|
通常,我会在'CustomerDetails'表中定义A,B和C的列名;但是,这张表不能改变,所以我必须使用我所得到的。我的任务规范中的要求是在移动设备的网格中显示15个以上的列;不是我想要的东西,但这些是要求。
好吧,最后,问题是:
可以使用sql查询键值配对表,并将这些键的值显示在上面的列中吗?这是我的要求,我想我需要在presoldorders表上使用我的连接创建一个查询,然后获取列表中每个客户的所有详细信息列表,并在代码中迭代并合并到数据表中手持式的。
答案 0 :(得分:0)
如果您事先知道所有键值,则可以转动结果集。我不确定sql server compact是否支持PIVOT
,但你可以这样做:
select CustomerNumber,
Max(Case when FieldName='A' then FieldValue end) as a_value,
// the same for B, C, all keys.
From CustomerDetails
Group by CustomerNumber
为简单起见,我不加入其他表,但我希望它能让您了解如何将行转换为列。