Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 如何对更多列使用pivot。?_Sql_Sql Server 2008 - Fatal编程技术网

Sql 如何对更多列使用pivot。?

Sql 如何对更多列使用pivot。?,sql,sql-server-2008,Sql,Sql Server 2008,我有一个表格LEAVTYPE:- LM_ID EMPCODE CCODE FINYEAR LVTYPE WEF OPN_BAL ENTITLE ELIGIBLE AVAILED 1 180480 IBTEH 2015-2016 CL 2015-07-31 00:00:00 4.50 0 4.50 1.50 3 180480 IBTEH 2015-2016 LE

我有一个表格LEAVTYPE:-

      LM_ID EMPCODE CCODE   FINYEAR  LVTYPE WEF                 OPN_BAL ENTITLE ELIGIBLE    AVAILED
       1    180480  IBTEH   2015-2016   CL  2015-07-31 00:00:00 4.50    0   4.50    1.50
       3    180480  IBTEH   2015-2016   LE  2015-07-31 00:00:00 35.50   0   35.50   0.00
       4    180480  IBTEH   2015-2016   PL  2015-07-31 00:00:00 6.00    1   7.00    0.00
       8    180541  IBTEH   2015-2016   LE  2015-07-31 00:00:00 33.50   0   33.50   0.50
       9    180541  IBTEH   2015-2016   PL  2015-07-31 00:00:00 1.50    1   2.50    1.50
      11    180546  IBTEH   2015-2016   CL  2015-07-31 00:00:00 8.00    0   8.00    1.00
      13    180546  IBTEH   2015-2016   LE  2015-07-31 00:00:00 32.00   0   32.00   0.00
      14    180546  IBTEH   2015-2016   PL  2015-07-31 00:00:00 6.00    1   7.00    0.00
      15    180546  IBTEH   2015-2016   CO  2015-07-31 00:00:00 1.00    0   1.00    1.00
现在,我想将表结构如下所示:-

LM_ID  EMPCODE CCODE  FINYEAR     WEF                CL_OPN_BAL     CL_ENTITLE     CL_ELIGIBLE   CL_AVAILED    LE_OPN_BAL     LE_ENTITLE     LE_ELIGIBLE   LE_AVAILED    PL_OPN_BAL     PL_ENTITLE     PL_ELIGIBLE   PL_AVAILED 

1      180480  IBTEH 2015-2016  2015-07-31 00:00:00  4.50            0              4.50          1.50          35.50          0              35.50          0.00          6.00           1            7.00             0.00

如何为每组EMPCOPDE获取此信息。

这将起作用。我们将根据LVTYPE从组中收集其他统计数据

WITH CTE
AS
(
SELECT LM_ID, EMPCODE, CCODE, FINYEAR, WEF, 
        CASE WHEN LVTYPE ='CL' THEN (OPN_BAL) END AS CL_OPN_BAL, 
        CASE WHEN LVTYPE ='CL' THEN (ENTITLE) END AS CL_ENTITLE, 
        CASE WHEN LVTYPE ='CL' THEN (ELIGIBLE) END AS CL_ELIGIBLE,
        CASE WHEN LVTYPE ='CL' THEN (AVAILED) END AS CL_AVAILED ,
        CASE WHEN LVTYPE ='LE' THEN (OPN_BAL) END AS LE_OPN_BAL,
        CASE WHEN LVTYPE ='LE' THEN (ENTITLE) END AS LE_ENTITLE,
        CASE WHEN LVTYPE ='LE' THEN (ELIGIBLE) END AS LE_ELIGIBLE,
        CASE WHEN LVTYPE ='LE' THEN (AVAILED) END AS LE_AVAILED, 
        CASE WHEN LVTYPE ='PL' THEN (OPN_BAL) END AS PL_OPN_BAL, 
        CASE WHEN LVTYPE ='PL' THEN (ENTITLE) END AS PL_ENTITLE, 
        CASE WHEN LVTYPE ='PL' THEN (ELIGIBLE) END AS PL_ELIGIBLE,
        CASE WHEN LVTYPE ='PL' THEN (AVAILED) END AS PL_AVAILED,             
        ROW_NUMBER() OVER(PARTITION BY EMPCOPDE ORDER BY EMPCOPDE) as indx
    FROM  LEAVTYPE

)

SELECT LM_ID, EMPCODE, CCODE, FINYEAR, WEF, CL_OPN_BAL, CL_ENTITLE, CL_ELIGIBLE,CL_AVAILED ,LE_OPN_BAL,LE_ENTITLE, LE_ELIGIBLE, LE_AVAILED, PL_OPN_BAL, PL_ENTITLE, PL_ELIGIBLE, PL_AVAILED
FROM CTE 
WHERE indx=1

一个组中将有许多记录具有不同的indx值。这里index=1将显示每组中的一条记录。

首先,您可以使用
交叉应用
外部应用
将列转换为行,以便将行值与列名组合在一起

SELECT DISTINCT LM_ID,EMPCODE, CCODE, FINYEAR, WEF,
LVTYPE+'_'+COLNAME COLNAME,VALS
INTO NEWTBL
FROM TEMPTBL 
OUTER APPLY(VALUES (OPN_BAL,'OPN_BAL'),(ENTITLE,'ENTITLE'),(ELIGIBLE,'ELIGIBLE'),(AVAILED,'AVAILED'))
COLUMNNAMES(VALS,COLNAME) 
现在,我已经将其插入到一个临时表
NEWTBL
,以便重用它来选择要透视的列
PIVOT
,并且在dynamic
PIVOT
中易于阅读

在这里,我声明了一个变量来选择用于数据透视的列名

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + COLNAME + ']', '[' + COLNAME + ']')
               FROM (SELECT DISTINCT COLNAME FROM NEWTBL) PV 
               ORDER BY COLNAME
现在您应该在动态查询中执行它,因为列名称本质上是动态的

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM 
             (
                 SELECT DISTINCT LM_ID,EMPCODE, CCODE, FINYEAR, WEF, COLNAME, VALS 
                 FROM NEWTBL
             ) x
             PIVOT 
             (
                 MIN(VALS)
                 FOR COLNAME IN (' + @cols + ')
            ) p
            '     
EXEC SP_EXECUTESQL @query
以下是工作版本

编辑:

为什么我的上述答案会重复
EMPCODE
是因为我根据您的预期结果添加了
lmu ID
。在这种情况下,它也将根据这一点进行分组。只是不要在结果中包含
lmu ID
,每个
EMPCODE
都会得到唯一的行


要查看结果

@davidsam是否要向我显示此查询的结果?用屏幕截图。或发送表结构。然后删除“WHERE indx=1”条件并检查结果。更新我。删除where条件后,它多次给出一个EMPCODE并给出空值。SU还可以使用哈希表而不是永久表。如果您有任何疑问,请回复@david samI希望一个EMPCODE的所有数据都在一行中,但您的查询在多行中提供了一个EMPCODE,因此您可以在预期结果中添加更多行数。K.我将更新@david samI已更新。查看编辑部分并通过单击“单击此处”链接检查结果。如果它没有自动运行,只需运行按钮runquery@davidsam