Sql server 在SQL中将行转换为列时缺少某些内容

Sql server 在SQL中将行转换为列时缺少某些内容,sql-server,tsql,Sql Server,Tsql,我试图将表中的行转换为列,我能够得到结果集,但对于少数记录,我缺少逻辑。下面是我正在运行的表和SQL,如果您认为P123过程\u END的查询结果应该为NULL,那么我得到的是过程\u BEGIN值,而不是NULL。我不确定我错过了什么,请帮我解决这个问题 INSERT INTO #PAT_TEST VALUES ( 'P123', 'D457', '2015-11-29 01:48:00.000', 1 ) , ( 'P123', 'D457', NULL, 0 ) ,

我试图将表中的行转换为列,我能够得到结果集,但对于少数记录,我缺少逻辑。下面是我正在运行的表和SQL,如果您认为P123过程\u END的查询结果应该为NULL,那么我得到的是过程\u BEGIN值,而不是NULL。我不确定我错过了什么,请帮我解决这个问题

INSERT  INTO #PAT_TEST
VALUES  ( 'P123', 'D457', '2015-11-29 01:48:00.000', 1 )
,       ( 'P123', 'D457', NULL, 0 )
,       ( 'P872', 'D457', '2015-11-30 02:48:00.000', 1 )
,       ( 'P872', 'D457', '2015-11-30 03:48:00.000', 0 );

SELECT  PAT_ID
      , DOC_ID
      , PROCEDURE_BEGIN = MIN(PROC_TIME)
      , PROCEDURE_END = MAX(PROC_TIME)
FROM    ( SELECT    PAT_ID
                  , DOC_ID
                  , PROC_TIME
                  , rn = ( ROW_NUMBER() OVER ( PARTITION BY PAT_ID, DOC_ID ORDER BY PROC_TIME ) - 1 ) / 2
          FROM      #PAT_TEST
        ) a
GROUP BY PAT_ID
      , DOC_ID
      , a.rn
ORDER BY PAT_ID
      , DOC_ID
      , PROCEDURE_BEGIN;

这对你有用吗:

如果null应被视为最大值:

SELECT PAT_ID ,DOC_ID, PROCEDURE_BEGIN=MIN(ISNULL(PROC_TIME,'99991231')), 
PROCEDURE_END=CASE WHEN MAX(ISNULL(PROC_TIME,'99991231')) ='99991231' THEN NULL ELSE MAX(ISNULL(PROC_TIME,'99991231')) END   
FROM( SELECT PAT_ID ,DOC_ID,PROC_TIME
,rn=(ROW_NUMBER() OVER (PARTITION BY PAT_ID,DOC_ID ORDER BY PROC_TIME)-1)/2
FROM #PAT_TEST
) a
GROUP BY PAT_ID ,DOC_ID, rn
ORDER BY PAT_ID,DOC_ID, PROCEDURE_BEGIN
    SELECT PAT_ID ,DOC_ID, PROCEDURE_BEGIN=CASE WHEN MIN(ISNULL(PROC_TIME,0)) = '19000101' THEN NULL ELSE MIN(ISNULL(PROC_TIME,0)) END, 
PROCEDURE_END=MAX(PROC_TIME )   
FROM( SELECT PAT_ID ,DOC_ID,PROC_TIME
,rn=(ROW_NUMBER() OVER (PARTITION BY PAT_ID,DOC_ID ORDER BY PROC_TIME)-1)/2
FROM #PAT_TEST
) a
GROUP BY PAT_ID ,DOC_ID, rn
ORDER BY PAT_ID,DOC_ID, PROCEDURE_BEGIN

如果null应被视为最小值:

SELECT PAT_ID ,DOC_ID, PROCEDURE_BEGIN=MIN(ISNULL(PROC_TIME,'99991231')), 
PROCEDURE_END=CASE WHEN MAX(ISNULL(PROC_TIME,'99991231')) ='99991231' THEN NULL ELSE MAX(ISNULL(PROC_TIME,'99991231')) END   
FROM( SELECT PAT_ID ,DOC_ID,PROC_TIME
,rn=(ROW_NUMBER() OVER (PARTITION BY PAT_ID,DOC_ID ORDER BY PROC_TIME)-1)/2
FROM #PAT_TEST
) a
GROUP BY PAT_ID ,DOC_ID, rn
ORDER BY PAT_ID,DOC_ID, PROCEDURE_BEGIN
    SELECT PAT_ID ,DOC_ID, PROCEDURE_BEGIN=CASE WHEN MIN(ISNULL(PROC_TIME,0)) = '19000101' THEN NULL ELSE MIN(ISNULL(PROC_TIME,0)) END, 
PROCEDURE_END=MAX(PROC_TIME )   
FROM( SELECT PAT_ID ,DOC_ID,PROC_TIME
,rn=(ROW_NUMBER() OVER (PARTITION BY PAT_ID,DOC_ID ORDER BY PROC_TIME)-1)/2
FROM #PAT_TEST
) a
GROUP BY PAT_ID ,DOC_ID, rn
ORDER BY PAT_ID,DOC_ID, PROCEDURE_BEGIN

MIN和MAX函数不会对空值进行操作,它们只会忽略这些值,并返回剩余集合的最小和最大日期。就我所知,这是时尚。