Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 bug时为空,或者更可能的情况是,我不理解分组集吗?_Sql_Sql Server_Grouping Sets - Fatal编程技术网

分组集中的列在不应为=SQL Server bug时为空,或者更可能的情况是,我不理解分组集吗?

分组集中的列在不应为=SQL Server bug时为空,或者更可能的情况是,我不理解分组集吗?,sql,sql-server,grouping-sets,Sql,Sql Server,Grouping Sets,我正在SQL Server 2019开发者版上运行下面的脚本。您可以在自己的SQL Server上运行它,任何数据库都可以,不需要特定的模式 在脚本的底部,我有一个查询,在GROUPBY子句中有两个分组集。第二个分组集包含一个表达式作为分组集中的唯一列,我在SELECT子句中将该表达式作为名为“Month”的列输出。由于此分组而呈现的行将“本月”列输出为NULL 我不希望这样。我预计任何输出与分组集中指定的列相同的列都应该包含该集合中的行分组所依据的值。简言之,我的结果集中的每一行在Month列

我正在SQL Server 2019开发者版上运行下面的脚本。您可以在自己的SQL Server上运行它,任何数据库都可以,不需要特定的模式

在脚本的底部,我有一个查询,在GROUPBY子句中有两个分组集。第二个分组集包含一个表达式作为分组集中的唯一列,我在SELECT子句中将该表达式作为名为“Month”的列输出。由于此分组而呈现的行将“本月”列输出为NULL

我不希望这样。我预计任何输出与分组集中指定的列相同的列都应该包含该集合中的行分组所依据的值。简言之,我的结果集中的每一行在Month列中都应该有一个值,因为该列的表达式在我的两个分组集中

我想得不对吗?通过运行此脚本在SQL Server上进行尝试

查询:

部分输出:

其他信息:

我还注意到,如果从第一个分组集中删除iib.InventoryDate列,并从SELECT子句中删除它,它实际上修复了我在这里提到的问题。。。第二个分组集正在输出的行实际上现在在Month列中包含那些缺少的值。奇怪的对吧?

这对我来说像个虫子。我误解了吗?

重写查询,以便明确引入[月份]

with cte as (
    select  [Id] ,
    [Quantity] ,
    [BatchNumber] ,
    [InventoryDate] ,
    [QuantityRemoved] ,
    [QuantityRemaining] ,
    [PricePerUnit],
    [Month] = CONVERT(VARCHAR,YEAR(InventoryDate)) + '.' + CONVERT(VARCHAR,FORMAT(InventoryDate, 'MM'))
    from #InventoryItemBatch     
)

-- offending query
SELECT
    'Grouping-Month' = GROUPING([Month])
    , 'Grouping-Id' = GROUPING(iib.Id)
    , 'Grouping-DatePurchased' = GROUPING(iib.InventoryDate)
    , [Month]
    , Id = iib.Id
    , DatePurchased = InventoryDate
    , SumPurchaseAmt = Sum(iib.PricePerUnit * iib.Quantity)

FROM cte iib
GROUP BY
    GROUPING SETS (
        (
              iib.Id
            , iib.InventoryDate
            , [Month]   
        )
        , (
              [Month]
        )
    ); 
重写查询,以便显式引入[Month]

with cte as (
    select  [Id] ,
    [Quantity] ,
    [BatchNumber] ,
    [InventoryDate] ,
    [QuantityRemoved] ,
    [QuantityRemaining] ,
    [PricePerUnit],
    [Month] = CONVERT(VARCHAR,YEAR(InventoryDate)) + '.' + CONVERT(VARCHAR,FORMAT(InventoryDate, 'MM'))
    from #InventoryItemBatch     
)

-- offending query
SELECT
    'Grouping-Month' = GROUPING([Month])
    , 'Grouping-Id' = GROUPING(iib.Id)
    , 'Grouping-DatePurchased' = GROUPING(iib.InventoryDate)
    , [Month]
    , Id = iib.Id
    , DatePurchased = InventoryDate
    , SumPurchaseAmt = Sum(iib.PricePerUnit * iib.Quantity)

FROM cte iib
GROUP BY
    GROUPING SETS (
        (
              iib.Id
            , iib.InventoryDate
            , [Month]   
        )
        , (
              [Month]
        )
    ); 

我认为问题的根源在于,您的计算表达式完全依赖于另一个分组列。我不确定这个行为是否由标准定义。解决这个问题的另一种方法似乎是用一个新名称创建一个列的副本:Thanke@shawnt00,它完全按照我的要求工作。这与下面Serg采取的方法基本相同。我已将该答案标记为已接受答案。谢谢你的帮助!!另外,顺便说一句,谢谢你的提示使用的格式。。。函数,这比我的长表达式好得多-我认为问题的根源在于,您的计算表达式完全依赖于另一个分组列。我不确定这个行为是否由标准定义。解决这个问题的另一种方法似乎是用一个新名称创建一个列的副本:Thanke@shawnt00,它完全按照我的要求工作。这与下面Serg采取的方法基本相同。我已将该答案标记为已接受答案。谢谢你的帮助!!另外,顺便说一句,谢谢你的提示使用的格式。。。函数,这比我的长表达式好得多-