2014-11-25 3 views
-1
id  record_name  record_value 
------------------------------------- 
1001 price1   12 
1001 price2   1 
1001 price3   8 
1201 price1   18 
1201 price2   2 
1201 price3   6 
1601 price1   12 
1601 price2   8 
1601 price3   8 

출력을 반환SQL Server는 ... 하위 쿼리 이상

id  price1  value  price2  value  price3  value 
-------------------------------------------------------------------------- 
1001 price1  12   price2  1   price3  8 
1201 price1  18   price2  2   price3  6 

내가 하위 쿼리는 1 개 이상의 값을 반환

오류를 얻고있다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 식으로 사용될 때 하위 쿼리가 수행되는 경우에는 허용되지 않습니다.

나는이 쿼리 사용 :

select distinct 
    a.id, 'Price1', 
    (select record_value 
    from table_name 
    where id = a.id and record_name = 'price1') as 'value1', 
    'Price2', 
    (select record_value 
    from table_name 
    where id = a.id and record_name = 'price2') as 'value2', 
    'Price3', 
    (select record_value 
    from table_name 
    where id = a.id and record_name = 'price3') as 'value3' 
from 
    table_name a 

는이 문제를 해결하려고하세요!

+3

그렇다면 DBMS는 무엇입니까? 포스트그레스? SQL Server? SQLite? –

+0

좋은 질문입니다. 어느 하나 – Jaques

+0

당신이 여기에 게시 한 데이터와 함께 .. 거기에 아무런 오류가 없습니다 .. 괜찮아요. – Deepshikha

답변

5

약간 다른 접근 방식입니다. 그러나 당신이 할 수 있습니다 :

SELECT 
    table_name.id, 
    'price1' AS price1, 
    SUM(CASE WHEN record_name='price1' THEN record_value ELSE 0 END) AS value1, 
    'price2' AS price2, 
    SUM(CASE WHEN record_name='price2' THEN record_value ELSE 0 END) AS value2, 
    'price3' AS price2, 
    SUM(CASE WHEN record_name='price3' THEN record_value ELSE 0 END) AS value3 
FROM 
    table_name 
GROUP BY 
    table_name.id 

업데이트

댓글에 댓글을 올리려면. 네, 효과가 있습니다. 다음과 같은 간단한 테스트를 살펴보면 :

DECLARE @tbl TABLE(ID INT, test VARCHAR(100)) 

INSERT INTO @tbl 
VALUES 
(1,'foo'), 
(1,'foo'), 
(1,'bar'), 
(1,'bar') 

이 쿼리는 고정 값 value1을 사용하여 작동합니다.

SELECT 
    tbl.ID, 
    'price1' as price1 
FROM 
    @tbl AS tbl 
GROUP BY 
    tbl.ID 

업데이트 2

그런 다음 당신은 값 SUM하지 않으려면. 그런 다음 MAX을 대신 사용할 수 있습니다. 이와 같이 :

SELECT 
    table_name.id, 
    'price1' AS price1, 
    MAX(CASE WHEN record_name='price1' THEN record_value ELSE 0 END) AS value1, 
    'price2' AS price2, 
    MAX(CASE WHEN record_name='price2' THEN record_value ELSE 0 END) AS value2, 
    'price3' AS price2, 
    MAX(CASE WHEN record_name='price3' THEN record_value ELSE 0 END) AS value3 
FROM 
    table_name 
GROUP BY 
    table_name.id 
+0

price1, price2, ..etc가 Group by에 포함되면이 쿼리가 작동합니까? –

+0

@PareshJ : 답변을 – Arion

+0

Arion, Nice 예제로 업데이트했습니다. 나는 정적 칼럼 값이 그룹에 필요한지 여부에 의심의 여지가 있었다. 자, 그 명백한. –

0

방금 ​​'하위 쿼리가 1보다 큰 값을 반환했습니다.'오류를 피하기 위해 쿼리에 '상위 1'을 추가하여 쿼리를 수정했습니다. 확인하고 상태를 업데이트하십시오.

select distinct 
    a.id, 'Price1', 
    (select top 1 record_value 
    from table_name 
    where id = a.id and record_name = 'price1') as 'value1', 
    'Price2', 
    (select top 1 record_value 
    from table_name 
    where id = a.id and record_name = 'price2') as 'value2', 
    'Price3', 
    (select top 1 record_value 
    from table_name 
    where id = a.id and record_name = 'price3') as 'value3' 
from 
    table_name a 
+0

중복을 포함한 모든 레코드가 필요합니다 ..... 상위 1 나를 위해 작동하지 않습니다 :( – Kumar

0

또한 하위 쿼리에서 Distinct를 시도 할 수도 있습니다. 최고의 솔루션이 아니지만 작동합니다.

select distinct 
a.id, 'Price1', 
(select distinct record_value 
from table_name 
where id = a.id and record_name = 'price1') as 'value1', 
'Price2', 
(select distinct record_value 
from table_name 
where id = a.id and record_name = 'price2') as 'value2', 
'Price3', 
(select distinct record_value 
from table_name 
where id = a.id and record_name = 'price3') as 'value3' 
from 
table_name a