我有下表:
CREATE TABLE [dbo].[Answer] (
[AnswerId] INT IDENTITY (1, 1) NOT NULL,
[QuestionId] INT NOT NULL,
[Correct] BIT NULL
);
以下是一些典型数据:
AnswerId QuestionId Correct
22 9 0
23 9 0
24 9 1
我需要得到答案001
AnswerId QuestionId Correct
22 9 1
23 9 0
24 9 1
我需要得到答案101
答案 0 :(得分:1)
如果我理解正确,您必须在一个连续字符串中按Correct
的顺序列出特定问题的AnswerId
列中的所有值。
以下是特定QuestionId
(递归CTE)的通用解决方案
DECLARE @Answers TABLE (
[AnswerId] INT NOT NULL,
[QuestionId] INT NOT NULL,
[Correct] BIT NULL
);
INSERT INTO @Answers (AnswerId,QuestionId,Correct) VALUES
(22, 9, 0),
(23, 9, 0),
(24, 9, 1);
;WITH Partitioned AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY QuestionId ORDER BY AnswerId ASC) AS RowNumber
, COUNT(1) OVER (PARTITION BY QuestionId) AS ColumnCount
, CONVERT(VARCHAR(MAX), Correct) AS Correct
FROM
@Answers
WHERE
[QuestionId] = 9
),
Concatenated AS (
SELECT RowNumber, ColumnCount, Correct FROM Partitioned WHERE RowNumber = 1
UNION ALL
SELECT
P.RowNumber
, P.ColumnCount
, C.Correct + P.Correct AS Correct
FROM
Partitioned P
INNER JOIN Concatenated C
ON P.RowNumber = C.RowNumber + 1
)
SELECT
CONVERT(VARCHAR(20), Correct) AS Correct
FROM
Concatenated
WHERE
RowNumber = ColumnCount
注意:将@Answers
更改为您的表格名称并删除表格声明和插入内容。
另一个解决方案是编写一个CLR函数来连接Correct
列中的值。
答案 1 :(得分:-1)
试试这个:
SELECT *,
'00'+CASE WHEN correct = 1 THEN '1' ELSE '0' END
FROM dbo.Answer
WHERE questionId = 9
编辑:为了在变量上保存结果,请使用以下格式。 (在变量上只保存一条记录)
Declare @YourVariable Nvarchar(20)
SELECT @YourVariable = '00'+CASE WHEN correct = 1 THEN '1' ELSE '0' END
FROM dbo.Answer
WHERE questionId = 9
答案 2 :(得分:-1)
一种直截了当的方式是: 将位转换为varchar 胶水" 00"到了开头 将整数转换为varchar(20)
像:
SELECT Convert(VARCHAR(20),(CONVERT(VARCHAR(2),N'00') + CONVERT(VARCHAR(1),Correct))) as converted from Answer where (QuestionId=9) order by AnswerId;