单个查询以检查SQL Server中的配对变量(前和后)值

时间:2018-12-31 07:45:31

标签: sql sql-server

我有两个表,它们是核对前和核对后的数据。我有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

2 个答案:

答案 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;