【问题标题】:SQL-Query using Pivot when Fields Are not fix字段未修复时使用 Pivot 进行 SQL 查询
【发布时间】:2016-08-23 06:06:47
【问题描述】:

在 SQL 中使用 Pivot 函数之前,我得到了这个记录结构

使用 Pivot 后:

这是我的 SQL 查询

SELECT

            FromHubID,
            FromHubName,
            ToHubID,
            SUM([1 - 100]) AS [1 - 100],
            SUM([101 - 250]) AS [101 - 250],
            SUM([251 - 500]) AS [251 - 500],
            SUM([501 - 1000]) AS [501 - 1000]

            FROM
    (SELECT 
            AccountGroupID,
            FromHubID,
            FromHubName,
            ToHubID,
            T_ID,
            [1 - 100],
            [101 - 250],
            [251 - 500],
            [501 - 1000]
    FROM
    (
        SELECT 
              AG.AccountGroupID
             ,AG.FromHubID
             ,FH.Hub_Name AS FromHubName
             ,AG.ToHubID
             ,AG.T_ID
             ,CONVERT(VARCHAR , [MinWeight])  + ' - ' + CONVERT(VARCHAR ,[MaxWeight]) AS slot
             ,[Rate]

          FROM 
                [CourierDev].[dbo].[AccountGroupQuotation] AS AG
                INNER JOIN HubMaster AS FH ON FH.Hub_Id = AG.FromHubID
          WHERE
                 accountgroupid = 1

    )Sourcetable

    PIVOT
    (
           Sum(Rate)          
           FOR slot IN (  [1 - 100],
                        [101 - 250],
                        [251 - 500],
                        [501 - 1000] )
    )AS AGQuotationList 
    )AS tbl

     GROUP  BY 
            FromHubID,
            FromHubName,
            ToHubID

我的问题是插槽中的字段数和它的值在此处未修复我在 Pivot 语法中添加静态字段并选择语法 对于这个特定的记录,但是当槽值和槽值计数不固定时如何管理?

FOR 示例 如果只有 2 种类型的记录 [1 - 100],[101 - 250] 那么我只想要两个枢轴

【问题讨论】:

    标签: sql-server database stored-procedures sql-server-2012


    【解决方案1】:

    您可以使用动态 SQL:

    DECLARE @columns nvarchar(max),
            @sql nvarchar(max)
    
    SELECT @columns = COALESCE(@columns,'') +','+QUOTENAME(slot)
    FROM #YourTable
    GROUP BY slot
    
    SELECT @sql = N'
    SELECT  FromHubID,
            FromHubName,
            ToHubID
            '+@columns+'
    FROM #YourTable
    PIVOT (
        SUM(Rate) FOR slot IN ('+STUFF(@columns,1,1,'')+')
    ) as pvt'
    
    EXEC sp_executesql @sql
    

    输出:

    FromHubID   FromHubName     ToHubID 1 - 100 101 - 250   251 - 500   501 - 1000
    5           BARODA R. O.    1       1       2           3           4
    5           BARODA R. O.    5       5       6           7           8
    

    【讨论】:

    • 这里 Slot 是 2 个字段的连接所以我使用了 QUOTENAME(CONVERT(VARCHAR , [MinWeight]) + ' - ' + CONVERT(VARCHAR ,[MaxWeight])) 和 GROUP BY CONVERT(VARCHAR , [ MinWeight]) + ' - ' + CONVERT(VARCHAR ,[MaxWeight]) 它在这里工作但是当我使用 '+@columns+' 作为插槽和 SUM(Rate) FOR slot IN ('+STUFF(@columns,1,1 ,'')+') 报错 Invalid Column 'slot' 怎么解决?
    • 简单的方法是将在透视之前获得的内容放入一些临时表中,然后使用我提供的代码。
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2014-06-09
    相关资源
    最近更新 更多