2014-01-23 4 views
0

는 내가 크로스 탭 쿼리가 존재 알고이MSAccess에서 다음 쿼리를 만드는 가장 효율적인 방법은 무엇입니까?

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

이 테이블/쿼리

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

을 변환 할하지만 값에 대한 집계 함수를 선택하라고 강요. 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 

일 수 있습니다. 그러나 나는 처음으로 갈 것입니다.

관련 문제