首页 > 解决方案 > 包括空值在内的多个字段的 SQL Pivot 语法

问题描述

我有(对我来说)需要使用枢轴的复杂情况。设置是这样的:

Parent
    Id
    Filter1
    Filter2
    TypeId

FirstChild
    Id
    ParentId
    Value
    Count
    ValidFrom
    ValidTo

SecondChild
    Id
    FirstChildId
    Value

TypeTable
    Id
    Type

在数据中,来自 Parent 的 Filter1、Filter2 和 Type 创建唯一集(我们在 DB 上有索引以确保它保持这种状态)。在 FirstChild 上,我们进行了代码验证,因此 ValidFrom - ValidTo 范围没有重叠 - 如果您对日期执行查询,则每个父级都会得到一行为方便起见,Parent 中的 Type 字段可以包含 Type1、Type2、Type3(有总共 75 种类型,但查询的那部分将动态生成)此外,某些类型的值可以为空,或者该行可能根本不存在,在这种情况下需要返回为空。SecondChild 应作为属于 FirstChild 的第一行返回

因此,返回非旋转数据集的查询如下所示

Select p.Id As ParentId, t.Type, c1.Value As Value, c1.Count, c2.Value As AdditionalValue
From TypeTable as t
Left Join Parent as p On t.Id = p.TypeId And Filter1 In @listFilter1 And Filter2 In @listFilter2
Left Join FirstChild As c1 On (c1.ValidFrom <= @ValidOn And c1.ValidTo >= @ValidOn) And c1.ParentId = p.Id
Left Join (Select * From SecondChild Where Id In (Select Min(Id) From SecondChild Group By FirstChildId)) As c2 On c2.FirstChildId = c1.Id
Where t.Id In(List of Id)  

给定搜索过滤器,所有 3 个字段(值、计数和附加值)都可以为空。但是,每个类型只能有一行。

我需要的是将结果转换为:

ParentId | Type1Value | Type1Count | Type1AdditionalValue | Type2Value | Type2Count | Type2AdditionalValue | and so on for 75 types

目前,我可以获得每个类型的值,但只能使用聚合 Sum(Value),其中我松散 null(我需要它)对于 3 个字段的 Pivot 尝试,我使用了 3 个单独的 Pivot 语句并将它们中的每一个加入最佳。但这非常复杂(最后我需要旋转 7 个字段)。所以,把我推向正确的方向,以简化我的查询。

标签: sqlnullpivot

解决方案


推荐阅读