Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于部门和状态列透视数据而不显示空值_Sql Server_Sql Server 2008_Pivot Table - Fatal编程技术网

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

Sql server 基于部门和状态列透视数据而不显示空值,sql-server,sql-server-2008,pivot-table,Sql Server,Sql Server 2008,Pivot Table,基于父子关系的数据透视存在问题, 对于每个父id,我们可以在不同的部门下使用多个具有不同状态的子id。 因此,我们尝试使用循环根据每个部门下的parentid和child status透视子数据。 我试图向您展示我们在sp中进行了所有操作和旋转后获得的示例数据。但我们遇到了一些问题 其中在子ID之间显示空值 提前感谢,任何帮助都将不胜感激 下面是显示实际父、子关系数据的查询 Select * into #Actual_data from ( select 1 AS PARENTID,260 AS

基于父子关系的数据透视存在问题, 对于每个父id,我们可以在不同的部门下使用多个具有不同状态的子id。 因此,我们尝试使用循环根据每个部门下的parentid和child status透视子数据。 我试图向您展示我们在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

因此,使用内置的
pivot
命令,您可以做到这一点。 当项目被复制时,您需要一个单独的行,因此当同一部门出现多个实例时,您需要创建一个
行编号

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

因此,使用内置的
pivot
命令,您可以做到这一点。 当项目被复制时,您需要一个单独的行,因此当同一部门出现多个实例时,您需要创建一个
行编号

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