Sql 如何对更多列使用pivot。?
我有一个表格LEAVTYPE:-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
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
,并且在dynamicPIVOT
中易于阅读
在这里,我声明了一个变量来选择用于数据透视的列名
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