sql server ...子查询返回的不止

-1 sql sql-server sql-server-2008

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
Run Code Online (Sandbox Code Playgroud)

产量

id      price1      value       price2      value       price3      value
--------------------------------------------------------------------------
1001    price1      12          price2      1           price3      8
1201    price1      18          price2      2           price3      6
Run Code Online (Sandbox Code Playgroud)

我收到了错误

子查询返回的值超过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 
Run Code Online (Sandbox Code Playgroud)

请尝试解决这个问题!

Ari*_*ion 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
Run Code Online (Sandbox Code Playgroud)

更新

回复评论.是的,它会奏效.如果我们看一下像这样的简单测试:

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

INSERT INTO @tbl
VALUES
(1,'foo'),
(1,'foo'),
(1,'bar'),
(1,'bar')
Run Code Online (Sandbox Code Playgroud)

此查询将使用静态值作为price1.

SELECT
    tbl.ID,
    'price1' as price1
FROM
    @tbl AS tbl
GROUP BY
    tbl.ID
Run Code Online (Sandbox Code Playgroud)

更新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
Run Code Online (Sandbox Code Playgroud)