T-SQL别名为Pivot数据集中的范围

时间:2014-02-24 13:13:19

标签: sql sql-server tsql pivot subquery

我的问题是我想从链接到当前对象的数据的表子集中截取一些数据。因此,我想将WHERE条件指定为[ForeignKey] = top.[Id],但不允许我在子选择语句中访问top.[Id] ...

SELECT 
    o.[MemberId] AS 'Member',
    o.[Probability] AS 'Probability 1',
    o.[ProbabilitySec] AS 'Probability 2',
    p.[0], p.[1], p.[2], p.[3], p.[4], p.[5], p.[6], p.[7], p.[8], p.[9], p.[10], p.[11], p.[12], p.[13], p.[14], p.[15], p.[16], p.[17], p.[18], p.[19], p.[20], p.[21], p.[22], p.[23], p.[24], p.[25], p.[26], p.[27], p.[28], p.[29], p.[30], p.[31], p.[32], p.[33], p.[34], p.[35], p.[36], p.[37], p.[38], p.[39], p.[40], p.[41], p.[42], p.[43], p.[44], p.[45], p.[46], p.[47], p.[48], p.[49], p.[50], p.[51], p.[52], p.[53], p.[54], p.[55], p.[56], p.[57], p.[58], p.[59], p.[60], p.[61], p.[62], p.[63], p.[64], p.[65], p.[66], p.[67], p.[68], p.[69], p.[70], p.[71], p.[72], p.[73], p.[74], p.[75], p.[76], p.[77], p.[78], p.[79], p.[80], p.[81], p.[82], p.[83], p.[84], p.[85], p.[86], p.[87], p.[88], p.[89], p.[90], p.[91], p.[92], p.[93], p.[94], p.[95], p.[96], p.[97], p.[98], p.[99], p.[100]
FROM 
    [Outputs] o,
    (   
        SELECT [Percentile], [Value]
            FROM [Percentiles]
            WHERE [OutputId] = 1    -- BUG: o.[Id] doesn't work ???
    ) AS rp
    PIVOT
    (
        SUM(rp.[Value])
        FOR rp.[Percentile] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31], [32], [33], [34], [35], [36], [37], [38], [39], [40], [41], [42], [43], [44], [45], [46], [47], [48], [49], [50], [51], [52], [53], [54], [55], [56], [57], [58], [59], [60], [61], [62], [63], [64], [65], [66], [67], [68], [69], [70], [71], [72], [73], [74], [75], [76], [77], [78], [79], [80], [81], [82], [83], [84], [85], [86], [87], [88], [89], [90], [91], [92], [93], [94], [95], [96], [97], [98], [99], [100])
    ) p;

数据库架构:

enter image description here

Percentiles是一个表,它为每个输出记录保存0到100之间每个百分位的值,因此其中的数据将如下所示:

 1  | 1 |  0  | 0.343
 2  | 1 |  1  | 0.678
 3  | 1 |  2  | 0.153
 4  | 1 |  3  | 0.753
 5  | 1 | ... | 0.154
101 | 1 | 100 | 0.834
102 | 2 |  0  | 0.182
103 | 2 |  1  | 0.724
104 | 2 |  2  | 0.692
105 | 2 |  3  | 0.341
106 | 2 | ... | 0.102

目的是将所有这些百分位数作为列,但仅限于给定的OutputId(但我无法在PIVOT使用的子选择中使用o.Id访问当前的OutputId。

有关信息,在Outputs表中,MemberId不是外键,而只是输出中有用的存储标识符。

您是否知道如何仅链接PIVOT使用的百分位数[OutputId]等于o.[Id](目前,该范围内无法访问o)?顺便说一下,它是上面代码中注释的行。

非常感谢!

1 个答案:

答案 0 :(得分:0)

我收到了一位朋友的帮助,他很快就解决了我的问题:)感谢她。如果它可以帮助其他人,这里是固定查询,输出和百分位之间的链接通过PIVOT工作。

SELECT 
    [ActivityId] AS 'Activity #',
    [MemberId] AS 'Member',
    [PValue] AS 'Plus Value',
    [Probability] AS 'Probability 1',
    [ProbabilitySec] AS 'Probability 2',
    p.[0], p.[1], p.[2], p.[3], p.[4], p.[5], p.[6], p.[7], p.[8], p.[9], p.[10], p.[11], p.[12], p.[13], p.[14], p.[15], p.[16], p.[17], p.[18], p.[19], p.[20], p.[21], p.[22], p.[23], p.[24], p.[25], p.[26], p.[27], p.[28], p.[29], p.[30], p.[31], p.[32], p.[33], p.[34], p.[35], p.[36], p.[37], p.[38], p.[39], p.[40], p.[41], p.[42], p.[43], p.[44], p.[45], p.[46], p.[47], p.[48], p.[49], p.[50], p.[51], p.[52], p.[53], p.[54], p.[55], p.[56], p.[57], p.[58], p.[59], p.[60], p.[61], p.[62], p.[63], p.[64], p.[65], p.[66], p.[67], p.[68], p.[69], p.[70], p.[71], p.[72], p.[73], p.[74], p.[75], p.[76], p.[77], p.[78], p.[79], p.[80], p.[81], p.[82], p.[83], p.[84], p.[85], p.[86], p.[87], p.[88], p.[89], p.[90], p.[91], p.[92], p.[93], p.[94], p.[95], p.[96], p.[97], p.[98], p.[99], p.[100]
FROM 
    (
        SELECT 
            o.[ActivityId],
            o.[MemberId],
            o.[Probability],
            o.[ProbabilitySec],
            sm.[PValue],
            rp.[Percentile],
            rp.[Value]
        FROM 
            [modeller].[Outputs] o
            INNER JOIN [core].[ScMember] sm
            ON sm.[Id] = o.[MemberId]
            INNER JOIN 
            (    
                SELECT [Percentile], [Value], [OutputId]
                FROM [modeller].[Percentiles]
            ) AS rp
            ON o.[Id] = rp.[OutputId]
    ) AS nested
    PIVOT
    (
        SUM(nested.[Value])
        FOR nested.[Percentile] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31], [32], [33], [34], [35], [36], [37], [38], [39], [40], [41], [42], [43], [44], [45], [46], [47], [48], [49], [50], [51], [52], [53], [54], [55], [56], [57], [58], [59], [60], [61], [62], [63], [64], [65], [66], [67], [68], [69], [70], [71], [72], [73], [74], [75], [76], [77], [78], [79], [80], [81], [82], [83], [84], [85], [86], [87], [88], [89], [90], [91], [92], [93], [94], [95], [96], [97], [98], [99], [100])
    ) p;