处理空值,pivot中的动态列 [英] Dealing with nulls, dynamic columns in pivot

查看:94
本文介绍了处理空值,pivot中的动态列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你有数据集中的空值,我正试图用总列进行数据透视,因此我的总列出现为空。我的代码如下



Hi have nulls in data set that I'm trying to pivot with a total column and hence my total column is coming out as null. My code is as follows

DECLARE @cols       NVARCHAR(MAX)=''
DECLARE @query      NVARCHAR(MAX)=''
DECLARE @COLS_SUM   NVARCHAR(MAX)=''

--Preparing columns for Pivot
SELECT @cols = @cols + QUOTENAME(finmonth) + ',' 
FROM (SELECT DISTINCT finmonth FROM [DATASOURCE] ) AS tmp
SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols))

--Preparing sum of columns for Totals Horizontal
SELECT @COLS_SUM = @COLS_SUM + QUOTENAME(finmonth) + '+' 
FROM (SELECT DISTINCT finmonth FROM [[DATASOURCE] ) AS tmp
SELECT @COLS_SUM = ','+ SUBSTRING(@COLS_SUM, 0, LEN(@COLS_SUM)) +' AS TOTAL'


SET @query = 
            'SELECT *'+@COLS_SUM+'  INTO #TAB FROM 
            (
                    SELECT var1, var2, var3, finmonth, sum(Actual_Activity) as [activity]
  FROM [[DATASOURCE]
  where [FinYear] = ''2018''
    group by  var1, var2, var3, finmonth
            ) src
            PIVOT 
            (
                   SUM([activity])  FOR finmonth IN (' + @cols + ')
            ) piv

            SELECT * FROM #TAB
            

            '

execute(@query)





以下是一些导致问题的虚拟数据示例。因此,一个Var1(下面的var1 = a)有finmonth = 2的数据但另一个没有。对于finmonth = 2,Var1 = b将为null,因为它们本月没有数据。



Here is some example dummy data which would result in the issue. So where one Var1 (var1=a in below) has data for finmonth=2 but another doesn't. Var1 = b will have null for finmonth = 2 as they have no data for this month.

var1	var2	var3	finmonth	Actual_activity
a	b	c	1	20
a	b	c	1	30
a	b	c	1	40
a	b	c	2	10
a	b	c	2	20
a	b	c	2	30
b	b	c	1	1
b	b	c	1	2
b	b	c	1	3





结果表如下所示 - 但第2行的总数应为6



The results table looks like this - but total for 2nd row should be 6

r1	var2	var3	1	2	Total
a	b	c	90	60	150
b	b	c	6	Null	Null





我尝试了什么:



我尝试在主要组中通过查询使用isnull但是似乎没有效果



What I have tried:

I've tried using isnull in the main group by query but seems to have no effect

推荐答案

sql语句的静态版本应如下所示:



A static version of sql statement should look like:

SELECT var1, var2, var3, [1], [2], COALESCE([1], 0) + COALESCE([2], 0) AS Total
FROM (
    SELECT var1, var2, var3, finmonth, Actual_Activity
    FROM YOUR_TABLE
    WHERE FinYear = 2018) AS DT
PIVOT(SUM(Actual_Activity) FOR finmonth IN ([1], [2])) AS PVT





现在,您必须将其转换为动态版。

如果您想避免 NULL [1] [2] cols,你可以使用 COALESCE 围绕他们的方法。



注意: FinYear finmonth 应该是数字字段!





如果您想在 @COLS_SUM 变量中获取正确的数据,检查一下:



Now, you have to "convert it" into dynamic version.
If you would like to avoid NULL's in [1] and [2] cols, you can use COALESCE method around them.

Note: FinYear and finmonth should be numeric fields!


If you would like to get correct data in a @COLS_SUM variable, check this:

SELECT @COLS_SUM = @COLS_SUM + 'COALESCE(' + QUOTENAME(finmonth) + ',0)+' 
FROM (SELECT DISTINCT finmonth FROM YOUR_TABLE ) AS tmp
SELECT @COLS_SUM = ','+ SUBSTRING(@COLS_SUM, 0, LEN(@COLS_SUM)) +' AS TOTAL'


这篇关于处理空值,pivot中的动态列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆