透视数据基于部门和状态列而不显示空值

时间:2018-01-11 18:34:15

标签: sql-server sql-server-2008 pivot-table

我们在根据父子关系转动数据方面存在问题, 对于每个父ID,我们可以在不同部门下具有不同状态的多个子ID。 因此,我们尝试使用循环基于每个部门下的parentid和子状态来转动子数据。 我试图向您展示我们在sp中进行所有操作和转动后所取得的样本数据。但是我们遇到了一些问题 其中在子ID之间显示空值。

提前致谢,我们将不胜感激。

以下是显示我们实际的父,子关系数据的查询

Select * into #Actual_data from (
select 1 AS PARENTID,260 AS CHILDID,'C' AS STATUS,'DENTAL' AS DEPARTMENT
UNION ALL
SELECT 1,230,'C','VISION'
UNION ALL
SELECT 1,200,'N','VISION'
UNION ALL
SELECT 1,530,'N','DENTAL'
UNION ALL
SELECT 1,450,'T','VISION'
UNION ALL
SELECT 1,300,'T','DENTAL'
UNION ALL
SELECT 1,330,'T','DENTAL'
) as a

Select * from #Actual_data

执行sp后,我们获得了以下数据

Select * into #Sp_data from (
select 'C' AS STATUS, 1 AS PARENTID ,NULL AS VISION_CHILDS,260 AS DENTAL_CHILDS
UNION ALL
select 'C', 1 ,230 ,NULL 
UNION ALL
SELECT 'N',1 ,200,NULL
UNION ALL
SELECT 'N',1 ,NULL,530
UNION ALL
SELECT 'T', 1 ,450,NULL
UNION ALL
SELECT 'T', 1 ,NULL,300
UNION ALL
SELECT 'T', 1,NULL, 330
)as a

select * from #Sp_data

预期输出:

STATUS  PARENTID    VISION_CHILDS   DENTAL_CHILDS
 C          1            230            260
 N          1            200            530
 T          1            450            300
 T          1            NULL           330

1 个答案:

答案 0 :(得分:2)

因此,使用内置的pivot命令,您可以执行此操作。 如果您想要复制项目时需要单独的行,则需要在同一部门的多个实例发生时创建row_number

select Status, ParentId, Vision as VisionChilds, Dental as DentalChilds
from (
    select *, 
        row_number() over (partition by ParentId, Status, department order by ChildId) rn 
    from #actual_data) s
pivot (max(childId) for department in (vision, dental)) p