SQL查询主键INSIDE case case error
问题描述:
下面的代码看起来应该可以工作,但是我得到了Only one expression can be specified in the select list when the subquery is not introduced with EXISTS
。我认为这是关于testrgstr_testname上avg(testResults)的关键。SQL查询主键INSIDE case case error
我有一张桌子上充满了一天中不同时间的测试结果。我想把日期范围内的所有污泥,灰尘和颗粒物测试结果,并将它们平均排列在一行上。
这导致了使用数据透视。唯一的问题是测试名称会根据从JAMES到FRANK的其他名称的一年中的时间而变化,这导致使用case语句来允许不同的测试名称,从而允许在关键点之后的不同列。
道歉的任何错误,因为这是剥离我的生产代码版本,我无法测试它。
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
...
返回结果集,而不是一个单一的值:
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
答
的问题是事实,你应该然后返回一个标量造成的。
您可以使用IF语句,并为每个案件进行陈述 - @pCampType = 'JAMES'
/@pCampType = 'FRANK'
或使用动态SQL:
DECLARE @SQL NVARCHAR(MAX) = '
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%'')
)'
DECLARE @InnerSelectSQL NVARCHAR(MAX) = N''
IF (@pCampType = 'JAMES')
@InnerSelectSQL = N'
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 '
ELSE IF (@pCampType = 'FRANK')
@InnerSelectSQL = N'
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 '
SET @SQL = @SQL + CHAR(13) + CHAR(10) + InnerSelectSQL + CHAR(13) + CHAR(10) + N'
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'
Dynamic SQL is uglier, but you avoid repetition.
难道只是我或者是第二次使用詹姆斯/弗兰克没有采取PIVOT中的账户?我在PLSQL更好,因此很高兴在这里学习。 – goneos
这就是说。谢谢。我得到我要去的地方错了,尽管这个错误似乎并没有指向我。 – goneos