sql 行转列 例子

一.
在行转列时,拼结多个问题的答案,放到一个列中显示

Create FUNCTION [dbo].[AggregateString]
(
@func_code varchar(20),
@emp_id int,
@store_id int,
@BIZ_DATE varchar(20),
@acvt_id int,
@qst_id int ---问题id

)
RETURNS varchar(1024)
AS
BEGIN
declare @Str varchar(1024)

select @Str = isnull(@Str+',','')+val
from v_visit_acvt_for_fac
where qst_id = @qst_id
and func_code =@func_code
AND BIZ_DATE =@BIZ_DATE
AND STORE_ID =@store_id
and acvt_id=@acvt_id
and emp_id =@emp_id

return @Str
END


GO


二.行转列,关键是有一个固定的id值作为转运的id,如果没有这样的固定id,可以考虑用虚拟的列。生成固定的id值。
WITH acvt_qst
AS
(
SELECT maq.ACVT_ID,
maq.QST_ID,
mq.qst_name,
row_number() OVER(PARTITION BY maq.ACVT_ID ORDER BY maq.qst_id) rownum
FROM MS_ACVT_QST maq

INNER JOIN MS_QST mq
ON mq.id = maq.QST_ID
WHERE mq.qst_name <> '拍照' --AND maq.ACVT_ID = 18

)

SELECT v.emp_id,
v.STORE_ID,
v.BIZ_DATE,
v.IMG_ID,
v.FUNC_CODE,
v.acvt_id,

max(CASE WHEN qcq.rownum = 1 AND
v.qst_id = qcq.qst_id
THEN qcq.qst_name
ELSE NULL
END ) AS question1,

max(CASE WHEN qcq.rownum = 1 AND
v.qst_id = qcq.qst_id
THEN dbo.AggregateString(func_code,emp_id,store_id,biz_date,v.acvt_id,v.qst_id)
ELSE NULL
END ) AS answer1,

max(CASE WHEN qcq.rownum = 2 AND
v.qst_id = qcq.qst_id
THEN qcq.qst_name
ELSE NULL
END ) AS question2,

max(CASE WHEN qcq.rownum = 2 AND
v.qst_id = qcq.qst_id
THEN dbo.AggregateString(func_code,emp_id,store_id,biz_date,v.acvt_id,v.qst_id)
ELSE NULL
END ) AS answer2,

max(CASE WHEN qcq.rownum = 3 AND
v.qst_id = qcq.qst_id
THEN qcq.qst_name
ELSE NULL
END ) AS question3,

max(CASE WHEN qcq.rownum = 3 AND
v.qst_id = qcq.qst_id
THEN dbo.AggregateString(func_code,emp_id,store_id,biz_date,v.acvt_id,v.qst_id)
ELSE NULL
END ) AS answer3,

max(CASE WHEN qcq.rownum = 4 AND
v.qst_id = qcq.qst_id
THEN qcq.qst_name
ELSE NULL
END ) AS question4,

max(CASE WHEN qcq.rownum = 4 AND
v.qst_id = qcq.qst_id
THEN dbo.AggregateString(func_code,emp_id,store_id,biz_date,v.acvt_id,v.qst_id)
ELSE NULL
END ) AS answer4

FROM v_visit_acvt_temp v
INNER JOIN acvt_qst qcq
ON qcq.acvt_id = v.acvt_id

WHERE BIZ_DATE ='2012-03-01' AND func_code ='FAC_40'--AND STORE_ID =55140
GROUP BY v.emp_id,
v.STORE_ID,
v.BIZ_DATE,
v.IMG_ID,
v.FUNC_CODE,
v.acvt_id
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值