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 ... Subquery вернулся более

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

Я получаю ошибку

Subquery вернулся более чем на 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

Итак, какая СУБД? Postgres? 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 

Update

Чтобы ответить на комментарий. Да, это сработает. Если мы посмотрим на простой тест следующим образом:

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

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

Этот запрос будет работать со статическим значением как цена1.

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

Update 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

Как цена1, цена2, ..etc включены в группу, будет ли этот запрос работать? –

+0

@PareshJ: Обновлен ответ – Arion

+0

Arion, Nice пример. я сомневался, требуется ли статическое значение столбца в группе или нет. Теперь это ясно. –

0

Я только изменил свой запрос, добавив «Top 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

Мне нужны все записи, включая дубликаты ..... top 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 
Смежные вопросы