База данных запросов для нескольких столбцов из таблицы пар ключ-значение - PullRequest
1 голос
/ 13 ноября 2011

Я работаю над определением SQL-запроса для использования в SQL Server Compact Edition 3.5 на телефоне с Windows Mobile.Мне нужно будет вернуть набор результатов из трех таблиц.

Я точно не помню всех имен столбцов, так как я задаю этот вопрос дома, но вот хороший примертаблицы, с которыми я имею дело.

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; 

Сложная часть - это таблица 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            |
|-------|-----------------|--------------|----------------|
|_________________________________________________________|

. Для информации, которую я буду отображать в Flex Grid Component One, поля FieldName, перечисленные в таблице CustomerDetails, будут фиксированными.

Здесьхочу, чтобы я хотел заархивировать:

 _____________________________________________________________________________________________________________________
|                 |           |          |     |                     |                     |                          |
| 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                      |
|-----------------|-----------|----------|-----|---------------------|---------------------|--------------------------|
|_____________________________________________________________________________________________________________________|

Обычно, я имел бы имена столбцов для A, B и C, определенные в таблице 'CustomerDetails';однако эту таблицу нельзя изменить, поэтому я должен работать с тем, что мне дали.Требования в спецификации для моей задачи - иметь более 15 столбцов, которые будут отображаться в сетке на мобильном устройстве;не то, что я бы пошел, но это требования.

Хорошо, наконец, вопрос:

Можно ли использовать sql для запроса таблицы сопоставления значения ключа и отображать значение этого ключа в столбцахкак выше?Это требование, которое у меня есть, и я думаю, что мне нужно будет создать один запрос с таблицей соединений с предварительными заказами, а затем получить список всех деталей для каждого клиента в списке, выполнить итерацию и объединить таблицу данных в коде напортативный.

1 Ответ

0 голосов
/ 13 ноября 2011

Если вы заранее знаете все ключевые значения, вы можете изменить набор результатов.Я не уверен, поддерживает ли SQL Server Compact PIVOT, но вы можете сделать: select CustomerNumber,<br> Max(Case when FieldName='A' then FieldValue end) as a_value,<br> // the same for B, C, all keys.<br> From CustomerDetails<br> Group by CustomerNumber
Для простоты я не объединяю другие таблицы, но надеюсь, что это даст вам представление о том, как превратить строки в столбцы.

...