2014-01-23 5 views
0

Я хочу, чтобы преобразовать эту таблицу/запросКаков наиболее эффективный метод создания следующего запроса в MSAccess?

+--------+-----------------+-----------------+ 
| tag_id | attribute_name | attribute_value | 
+--------+-----------------+-----------------+ 
|  1 | tag_name  | P1001   | 
|  1 | tag_address  | N7:0   | 
|  1 | tag_description | Pump 1 Status | 
|  2 | tag_name  | P1002   | 
|  2 | tag_address  | N7:1   | 
|  2 | tag_description | Pump 2 Status | 
|  3 | tag_name  | P1003   | 
|  3 | tag_address  | N7:2   | 
|  3 | tag_description | Pump 3 Status | 
+--------+-----------------+-----------------+ 

к этому

+----------+-------------+-----------------+ 
| tag_name | tag_address | tag_description | 
+----------+-------------+-----------------+ 
| P1001 | N7:0  | Pump 1 Status | 
| P1002 | N7:1  | Pump 2 Status | 
| P1003 | N7:2  | Pump 3 Status | 
+----------+-------------+-----------------+ 

Я знаю перекрестную вкладку запроса существует, но она заставляет меня выбрать агрегатную функцию для Value. Если я выберу First или Max, он работает, но это не очень эффективный способ сделать это. Любой лучший способ?

ответ

0
select tag_name, tag_address, tag_description from 
(
    (
     select tag_id, attribute_value as tag_name 
     from inputtable 
     where attribute_name='tag_name' 
    ) as one 
    left join 
    (
     select tag_id, attribute_value as tag_address 
     from inputtable 
     where attribute_name='tag_address' 
    ) as two 
    on one.tag_id=two.tag_id 
) 
left join 
(
    select tag_id, attribute_value as tag_description 
    from inputtable 
    where attribute_name='tag_description' 
) as three 
on one.tag_id=three.tag_id 
+0

Доступ не понравится этому запросу. Это вызовет синтаксическую ошибку из-за отсутствия круглых скобок вокруг первой пары соединенных подзапросов. (Доступ довольно суетливый.) –

+0

А ... Я больше парень SQL Server. Исправлена. Спасибо за совет! –

0

Как вы предложили в вашем вопросе,

TRANSFORM MAX(attribute_value) AS thing 
SELECT tag_id 
FROM your_table 
GROUP BY tag_id 
PIVOT attribute_name IN ('tag_name','tag_address','tag_description') 

будет работать. Другой альтернативой может быть

SELECT tn.tag_name, ta.tag_address, td.tag_description 
FROM 
    (
     (
      SELECT 
       tag_id, 
       attribute_value AS tag_name 
      FROM your_table 
      WHERE attribute_name = 'tag_name' 
     ) AS tn 
     INNER JOIN 
     (
      SELECT 
       tag_id, 
       attribute_value AS tag_address 
      FROM your_table 
      WHERE attribute_name = 'tag_address' 
     ) AS ta 
      ON ta.tag_id = tn.tag_id 
    ) 
    INNER JOIN 
    (
     SELECT 
      tag_id, 
      attribute_value AS tag_description 
     FROM your_table 
     WHERE attribute_name = 'tag_description' 
    ) AS td 
     ON td.tag_id = tn.tag_id 

, но я бы, скорее всего, пошел первым.

Смежные вопросы