디자인 타임에 열 수 (즉, 질문)를 알지 못하면 SQL
(동적 쿼리 제외)으로는 수행 할 수 없습니다.
당신은 표 형식으로 원하는 데이터를 가져 다음 클라이언트 측에서이를 처리해야합니다, 아마,
SELECT *
FROM Question
LEFT OUTER JOIN
Response
ON Response.QuestionId = Question.QuestionID
또는이 (SQL Server 2005+
, Oracle 8i+
및 PostgreSQL 8.4+
에서) :
SELECT *
FROM (
SELECT q.*, ROW_NUMBER() OVER (ORDER BY questionID) AS rn
FROM Question q
) q
LEFT OUTER JOIN
(
SELECT r.*, ROW_NUMBER() OVER (PARTITION BY questionID ORDER BY ResponseID) AS rn
FROM Response r
) r
ON r.QuestionId = q.QuestionID
AND q.rn = r.rn
ORDER BY
q.rn, q.QuestionID
후자의 쿼리는이 양식의 결과를 제공합니다 (4
개의 질문이 제공된 경우).
rn question response
--- --- ---
1 Question 1 Response 1.1
1 Question 2 Response 2.1
1 Question 3 Response 3.1
1 Question 4 Response 4.1
2 Question 1 Response 1.2
2 Question 2 Response 2.2
2 Question 3 NULL
2 Question 4 Response 4.2
3 Question 1 NULL
3 Question 2 NULL
3 Question 3 Response 3.3
3 Question 4 NULL
의 경우 행 번호를 표시하는 rn
으로 표 형식으로 데이터를 출력합니다.
rn
이 클라이언트에서 변경 될 때마다 <tr>
을 닫고 새 메시지를 엽니 다. 같은 번호 또는 행이 각 rn
이 반환이 보장되기 때문에
당신은 안전하게, 결과 집합 행 당 <td>
의 하나를 넣을 수 있습니다 것은 꽤 자주 질문을합니다.
SQL
역동적 인 수의 열로 데이터를 반환하는 데 적합한 도구가 아닙니다.
SQL
은 집합에서 작동하고 열 레이아웃은 집합의 암시 적 속성입니다.
가변의 데이터 유형을 C
에 정의하는 것처럼 디자인 타임에 가져올 세트의 레이아웃을 정의해야합니다.
C
은 엄격하게 정의 된 변수와 함께 작동하며, SQL
은 엄격하게 정의 된 집합과 함께 작동합니다.
나는 이것이 가능한 최선의 방법이라는 것을 말하는 것이 아니라는 점에 유의하십시오. 그것은 단지 SQL
의 작동 방식입니다.
업데이트 :
SQL Server
에서 바로 데이터베이스에서 HTML
형태의 테이블을 뽑을 수 :
WITH a AS
(
SELECT a.*, ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id) AS rn
FROM answer a
),
rows AS (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM answer a
WHERE question_id =
(
SELECT TOP 1 question_id
FROM answer a
GROUP BY
question_id
ORDER BY
COUNT(*) DESC
)
)
SELECT (
SELECT COALESCE(a.value, '')
FROM question q
LEFT JOIN
a
ON a.rn = rows.rn
AND a.question_id = q.id
FOR XML PATH ('td'), TYPE
) AS tr
FROM rows
FOR XML PATH(''), ROOT('table')
자세한 내용에 대한 내 블로그에서이 항목을 참조하십시오
Dynamic pivot
어떤 데이터베이스 서버입니까? – AakashM
SQL Server가됩니다. 항상 피 묻은 SQL Server입니다. – skaffman
예, SQL Server. XML을 사용하는 데 필요한 일을하고 함수를 통해 집계를 수행합니다. – IThasTheAnswer