我有两个表,它们是核对前和核对后的数据。我有60个奇数变量,需要检查这些值是否已更改或在检查前和检查后保持不变。现在,我正在单独编写查询以检查所有60个变量:
select count(*) [Pre checkup],
(select count(*)
from Precheckup pre join
Postcheckup post
on pre.VISIT_ID = post.VISIT_ID and
pre.VEHICLE_REG_NO = post.VEHICLE_REG_NO
where pre.COOLANT = 1 and post.COOLANT = 3
) [Post checkup]
from Precheckup
where COOLANT = 1
输出
Pre checkup Post checkup
286 35
select count(*) [Pre checkup],
(select count(*)
from Precheckup pre join
Postcheckuppost post
on pre.VISIT_ID = post.VISIT_ID and
pre.VEHICLE_REG_NO = post.VEHICLE_REG_NO
where pre.BELTS_IDLERS = 1 and
post.BELTS_IDLERS = 3
) [Post checkup]
from Precheckup
where BELTS_IDLERS = 1
输出
Pre checkup Post checkup
127 18
表格格式
CustID Name Number COOLANT BELTS_ILDERS RADIATOR ... ...[60 ODD SUCH COLUMNS]
我需要以下格式的输出:
COMPONENT Pre-Checkup Post-Checkup
COOLANT 286 35
BELTS_IDLERS 127 18
RADIATOR 112 45
... ... ...
... ... ...
是否可以在一次查询中检查所有60个变量的值,这些变量的值在预检查期间为1,而在检查后其值变为3?
我尝试了戈登的查询:
select v.var, count(v.preval),COUNT(v.postval)
from Precheckup pre join
Postcheckup post
on pre.VISIT_ID = post.VISIT_ID and
pre.VEHICLE_REG_NO = post.VEHICLE_REG_NO cross apply
(values ('Coolant', pre.coolant, post.coolant),
('Belt_idlers', pre.BELTS_IDLERS, post.BELTS_IDLERS)
)
v(var, preval, postval)
where v.preval = 1 and
v.postval = 3
group by v.var,v.preval,v.postval;
我得到了低于结果的结果。
var (No column name) (No column name)
Belt_idlers 18 18
Coolant 35 35
但是它不是我想要的格式,如下所示:
COMPONENT Pre-Checkup Post-Checkup
COOLANT 286 35
BELTS_IDLERS 127 18
RADIATOR 112 45
答案 0 :(得分:0)
如果我正确理解了您的问题,则可以尝试生成并执行动态SQL。在这种情况下,重要的是排除所有不是项目名称的列:
-- Declarations
DECLARE
@stm nvarchar(max),
@err int
-- Statement generation
SET @stm = N''
SELECT @stm = @stm +
N'union all ' +
N'select ' +
[name] +
N' AS Component, ' +
N'count(*) [Pre checkup],
(
select count(*) from Precheckup pre
join Postcheckup post on pre.VISIT_ID = post.VISIT_ID and pre.VEHICLE_REG_NO = post.VEHICLE_REG_NO
where pre.' +
[name] +
N' = 1 and post.' +
[name] +
N' = 3
) [Post checkup]
from Precheckup
where ' +
[name] +
N' = 1
group by ' +
[name] +
N' '
FROM sys.columns
WHERE
(([name] <> 'CustID') AND ([name] <> 'Number') AND ([name] <> 'Name') AND ([name] <> 'VISIT_ID')AND ([name] <> 'VEHICLE_REG_NO')) AND
(OBJECT_NAME([object_id]) = 'Precheckup')
SET @stm = STUFF(@stm, 1, 10, N'')
-- Execution
PRINT @stm
EXEC @err = sp_executesql @stm
IF @err = 0
PRINT 'OK'
ELSE
PRINT 'Error'
答案 1 :(得分:0)
您可以使用apply
取消显示结果:
select v.var, count(*)
from Precheckup pre join
Postcheckuppost post
on pre.VISIT_ID = post.VISIT_ID and
pre.VEHICLE_REG_NO = post.VEHICLE_REG_NO cross apply
(values ('Coolant', pre.coolant, post.coolant),
('Belt_idlers', pre.Belt_idlers, post.Belt_idlers),
. . . -- list the variables here
) v(var, preval, postval)
where pre.preval = 1 and
post.postval = 3
group by v.var;