2015-10-13 43 views
5

Tôi có một bảng trong đó mỗi cột là một câu hỏi và các hàng là câu trả lời mà có thể giả định giá trị 1-4TSQL lần xuất hiện đếm trong nhiều cột

cách hiệu quả nhất để tính toán lần xuất hiện của mỗi câu trả lời cho mỗi câu hỏi là gì?

bảng Input

q1 q2 q3 
1 3 1 
2 1 4 
1 2 1 

bảng Output mong muốn

answer q1 q2 q3 

    1 2 0 2 
    2 1 1 0 
    3 0 1 0 
    4 0 0 1 

Cho đến nay tôi đến những điều sau đây (đối với câu hỏi q3) nhưng nó chỉ dành cho một câu hỏi

CREATE TABLE #t 
    (
    answer int 
) 
insert into #t (answer) values (1) 
insert into #t (answer) values (2) 
insert into #t (answer) values (3) 
insert into #t (answer) values (4) 

select * into #q3 from (select q3 as q3,count(*) as occurenceq3 
        from [table] 
        group by q3) as x 

select t.answer,tb.occurenceq3 as occurenceq3 
from #t t left join #q3 tb on t.answer=tb.Q3 

drop table #q3 
drop table #t 
+0

lẽ UNPIVOT sau đó trục. – shawnt00

Trả lời

4
select answer, q1, q2, q3 
from 
    q 
    unpivot (answer for q in (q1, q2, q3)) as upvt 
    pivot (count(q) for q in (q1, q2, q3)) as pvt 

Tôi đã phạm sai lầm đầu tiên khi thử count(*) nhưng tôi nghĩ rằng nó có ý nghĩa rằng tập hợp phải được rõ ràng trên cột được xoay vòng, mặc dù tôi nghĩ rằng chúng sẽ tương đương về mặt logic.

+0

hmm nó không biên dịch: Cú pháp không chính xác gần '*'. – user2418209

+0

Có thể bạn không thể tham khảo thư mục bảng cơ sở. Tôi đã cố gắng để chạy này trên SQL Fiddle nhưng trang web là hành động kỳ lạ như bình thường. – shawnt00

+0

Nếu bạn quay lại bài đăng gốc và thay thế số (*) bằng số đếm (q), truy vấn sẽ hoạt động. –

1

này nên làm việc: -

CREATE TABLE #question (q1 int, q2 int, q3 int) 
INSERT INTO #question 
VALUES 
(1,3,1), 
(2,1,4), 
(1,2,1); 

--unpivot to start with 
WITH 
UNPIVOTED AS 
(
SELECT * 
FROM 
    (SELECT q1,q2,q3 
    FROM #question) p 
UNPIVOT 
    (answer FOR question in (q1,q2,q3)) AS unpvt 
) 

--Then pivot 
SELECT * FROM 
(SELECT answer, question FROM unpivoted) p 
PIVOT 
(
COUNT(question) 
FOR question IN (q1,q2,q3) 
) as pvt 
0

Nếu bạn muốn cách hiệu quả nhất, tôi sẽ đề nghị đặt một chỉ mục trên mỗi cột "q" và chạy các truy vấn như:

select a.answer, 
     (select count(*) from #question q where q.q1 = a.answer) as q1, 
     (select count(*) from #question q where q.q2 = a.answer) as q2, 
     (select count(*) from #question q where q.q3 = a.answer) as q3 
from (select 1 as answer union all select 2 union all select 3 union all select 4 
    ) a; 

Điều này về cơ bản sử dụng các chỉ số để đếm các giá trị và nên được khá nhanh, nhanh hơn so với tổng hợp tất cả các kết quả chưa được phân loại.

0

này sẽ làm việc

select t1.dis, 
q1=(select count(q1) from CountAnswers where q1=t1.dis), 
q2=(select count(q2) from countAnswers where q2=t1.dis), 
q3=(select count(q3) from countAnswers where q3=t1.dis) 
from (select dis from(select q1 as dis from CountAnswers union select q2 as dis from CountAnswers union select q3 as dis from CountAnswers)mytab)t1; 
Các vấn đề liên quan