Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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 2005 在SQL Server中组合没有公共元素(pivot)的列_Sql Server 2005_Pivot_Unpivot - Fatal编程技术网

Sql server 2005 在SQL Server中组合没有公共元素(pivot)的列

Sql server 2005 在SQL Server中组合没有公共元素(pivot)的列,sql-server-2005,pivot,unpivot,Sql Server 2005,Pivot,Unpivot,我正在试图找到显示某些数据的最佳方式 我的数据集如下所示: Form var1_Day var1_WTD var1_30Day var2_Day var2_WTD var2_30Day ... NA null null null 77 448 2581 A1 166 791 4842 null null null A2 304 1312

我正在试图找到显示某些数据的最佳方式

我的数据集如下所示:

Form  var1_Day  var1_WTD  var1_30Day  var2_Day  var2_WTD  var2_30Day ...
NA    null      null      null        77        448       2581
A1    166       791       4842        null      null      null
A2    304       1312      8365        null      null      null
A3    29        113       656         null      null      null
Var   Form  Day   WTD   30Day
var1  NA    null  null  null
var1  A1    166   791   4842
var1  A2    304   1312  8365
var1  A3    29    113   656
var2  NA    77    448   2581
var2  A1    null  null  null
var2  A2    null  null  null
var2  A3    null  null  null
...
我正试图弄清楚我将如何像这样显示数据:

Form  var1_Day  var1_WTD  var1_30Day  var2_Day  var2_WTD  var2_30Day ...
NA    null      null      null        77        448       2581
A1    166       791       4842        null      null      null
A2    304       1312      8365        null      null      null
A3    29        113       656         null      null      null
Var   Form  Day   WTD   30Day
var1  NA    null  null  null
var1  A1    166   791   4842
var1  A2    304   1312  8365
var1  A3    29    113   656
var2  NA    77    448   2581
var2  A1    null  null  null
var2  A2    null  null  null
var2  A3    null  null  null
...
我相信我将不得不使用透视表,但不确定从哪里开始

谢谢,,
布拉德

事实上,你想要
UNPIVOT

就像这样

select SUBSTRING(t,1,4) as Var, form, day, wtd, 30day 
from yourtable
unpivot ([day] for d in (var1_day,var2_day)) td
unpivot ([wtd] for w in (var1_wtd,var2_wtd)) tw
unpivot ([30day] for t in (var1_30day,var2_30day)) tt
where SUBSTRING(d,1,4) = SUBSTRING(w,1,4)
and  SUBSTRING(d,1,4) = SUBSTRING(t,1,4)

虽然您可以像另一个答案一样通过静态透视来实现这一点,但如果您有很多列要转换,则可以使用动态透视:

DECLARE @colsUnPivot AS NVARCHAR(MAX),
    @colsPivot AS NVARCHAR(MAX),
    @colsUnPivotNull as NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @colsUnPivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('test') and
               C.name like 'var%'
         for xml path('')), 1, 1, '')

SET @colsUnPivotNull = stuff((select ', IsNull('+ quotename(C.name) +', 0)' + quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('test') and
               C.name like 'var%'
         for xml path('')), 1, 1, '')

SET @colsPivot = stuff((select DISTINCT ','+quotename(right((C.name), len(C.name)-5))
         from sys.columns as C
         where C.object_id = object_id('test') and
               C.name like 'var%'
         for xml path('')), 1, 1, '')

set @query 
  = ' 
      SELECT var, form,  '+ @colsPivot +'
      FROM
      (
        SELECT distinct substring(field, 1, 4) var, 
          --field,
          right((field), len(field)-5) as col,
          form,
          value
        from 
        (
          SELECT form, '+ @colsUnPivotNull + '
          FROM test
        ) t1
        unpivot 
        (
           value
           for field in (' + @colsUnPivot + ')
        ) unpvt 
      ) x
      pivot
      (
        sum(value)
        for col in ('+ @colsPivot + ')
      ) p
      ORDER BY var, form'

execute(@query)


这将在执行时获取要取消pivot的列列表和透视。如果有很多列,则不必硬编码这些值

谢谢,它工作得很好。我把它放在一个sql FIDLE中进行测试:如果你有9种以上的var类型,你需要在最后调整过滤器——他们假设它来自var1-var9