SQL查询数据透视INSIDE一个case语句错误

时间:2016-03-07 05:35:34

标签: sql-server

以下代码看起来应该可行,但我得到了Only one expression can be specified in the select list when the subquery is not introduced with EXISTS。我认为这是在testrgstr_testname上引用avg(testResults)的轴心。

我在一天中的不同时间都有一张表,里面有各种测试结果。我想把所有结果用于污泥,灰尘和颗粒测试的日期范围,并将它们平均到一行。

这导致了一个枢轴的使用。唯一的问题是测试名称根据从JAMES,FRANK到其他名称的时间而变化,这导致使用case语句来允许不同的测试名称,因此允许不同的测试名称。

对于任何错误道歉,因为这是我的生产代码的版本,我无法测试它。

WITH
TestData as (
       SELECT TestName, CONVERT(DECIMAL(10,2),result) as TestResult
  FROM TestReg
 WHERE  ResultDate BETWEEN @pFromDate AND @pToDate
   and (testrgstr_testname like '%Sludge%'
    or testrgstr_testname like '%Dust%'
    or testrgstr_testname like '%Particle%')
)

SELECT CASE 
    WHEN @pCampType = 'JAMES' THEN
        (
            SELECT [JDTD JAMES Cutting Sludge AT] as s_at, [JDTD JAMES Cutting Sludge AO] as s_ao,
                   [JDTD JAMES Dust AT] as d_at, [JDTD JAMES Dust AO)] as d_ao,
                   [JDTD JAMES Particle_AT] as p_at, [JDTD JAMES Particle_AO] p_ao 
            FROM TestData 
            PIVOT 
            ( 
                avg(TestResult) 
                FOR testrgstr_testname 
                IN ([JDTD JAMES Cutting Sludge AT],[JDTD JAMES Cutting Sludge AO], 
                    [JDTD JAMES Dust AT, [JDTD JAMES Dust AO], 
                    [JDTD JAMES Particle_AT],[JDTD JAMES Particle_AO]) 
            ) as pvt
        )
    WHEN @pCampType = 'FRANK' THEN
        (
            SELECT [JDTD FRANK Cutting Sludge AT] as s_at, [JDTD JAMES FRANK Sludge AO] as s_ao,
                   [JDTD FRANK Dust AT] as d_at, [JDTD FRANK Dust AO)] as d_ao,
                   [JDTD FRANK Particle_AT] as p_at, [JDTD FRANK Particle_AO] as p_ao
            FROM TestData 
            PIVOT 
            ( 
                avg(TestResult) 
                FOR testrgstr_testname 
                IN ([JDTD JAMES Cutting Sludge AT],[JDTD JAMES Cutting Sludge AO], 
                    [JDTD JAMES Dust AT, [JDTD JAMES Dust AO], 
                    [JDTD JAMES Particle_AT],[JDTD JAMES Particle_AO]) 
            ) as pvt
        )
    ELSE
        (
            SELECT 'ERROR'
        )
    END
    

1 个答案:

答案 0 :(得分:1)

问题是由于你应该从那里返回一个标量:

y[i]=y

返回结果集,而不是单个值。

您可以使用IF语句并为每个案例执行一个语句 - SELECT [JDTD JAMES Cutting Sludge AT] as s_at, [JDTD JAMES Cutting Sludge AO] as s_ao, [JDTD JAMES Dust AT] as d_at, [JDTD JAMES Dust AO)] as d_ao, [JDTD JAMES Particle_AT] as p_at, [JDTD JAMES Particle_AO] p_ao ... / @pCampType = 'JAMES'或使用动态SQL:

@pCampType = 'FRANK'