SQL:如何对这些调查答案进行分组?
SQL: How do I group these survey answers?
我有一个 table 将调查答案存储在数据库中:
╔════════════════╦════════════════╦════════════════╗
║ Question01 ║ Question02 ║ Question03 ║
╠════════════════╬════════════════╬════════════════╣
║ Certainly True ║ Certainly True ║ Certainly True ║
║ NULL ║ Certainly True ║ NULL ║
║ Partly True ║ Partly True ║ Certainly True ║
║ Certainly True ║ Certainly True ║ Certainly True ║
║ Certainly True ║ Certainly True ║ Certainly True ║
║ Certainly True ║ Partly True ║ Certainly True ║
╚════════════════╩════════════════╩════════════════╝
我将如何在 SQL 中将它们分组以显示:
+----------------+--+--+-------------+----------+--+-------------+--
| Certainly True | Partly True | Not True | Do not Know | Missing |
+-----------------+-------------+----------+-------------+---------+
| | | | | |
| 214 | 12 | 0 | 0 | 1 |
| | | | | |
| 180 | 42 | 3 | 1 | 1 |
| | | | | |
| 223 | 2 | 0 | 1 | 1 |
| | | | | |
+-----------------+-------------+----------+--+-------------+-------
其中每一行是不同的问题,而列是该问题的答案计数。
我正在使用 SQL Manangement Studio。
请指路。谢谢
更新:我是如何解决这个问题的:
CREATE TABLE #temp1 (
Questions varchar(100),
Answers varchar(100) )
insert into #temp1 (Questions, Answers)
SELECT 'Question01' AS Questions, Question01 AS Answers FROM #Table1
UNION ALL
SELECT 'Question02' AS Questions, Question02 AS Answers FROM #Table1
UNION ALL
SELECT 'Question03' AS Questions, Question03 AS Answers FROM #Table1
SELECT Questions,
COUNT(CASE WHEN Answers = 'Certainly True' THEN 1 END) AS CertainlyTrue,
COUNT(CASE WHEN Answers = 'Partly True' THEN 1 END) AS PartlyTrue,
COUNT(CASE WHEN Answers = 'Not True' THEN 1 END) AS NotTrue,
COUNT(CASE WHEN Answers = 'Do not Know' THEN 1 END) AS DoNotKnow,
COUNT(CASE WHEN Answers IS NULL THEN 1 END) AS Missing,
COUNT(questions) AS Total
FROM #temp1
GROUP BY questions;
可能不是最优雅的方式,但它确实有效。
您可以使用:
WITH cte AS (
SELECT 'Question1' AS grp, Question1 AS Question FROM tab UNION ALL
SELECT 'Question2' AS grp, Question2 AS Question FROM tab UNION ALL
SELECT 'Question3' AS grp, Question3 AS Question FROM tab
)
SELECT grp,
COUNT(CASE WHEN Question = 'Certainly True' THEN 1 END) AS Certainly_True,
COUNT(CASE WHEN Question = 'Partly True' THEN 1 END) AS Partly_True,
...
COUNT(CASE WHEN Question IS NULL THEN 1 END) AS missing
FROM table
GROUP BY grp;
我会反转并使用条件聚合:
select v.q,
sum(case when v.v = 'Certainly True' then 1 else 0 end) as Certainly_True,
sum(case when v.v = 'Partly True' then 1 else 0 end) as Partly_True,
sum(case when v.v = 'Not True' then 1 else 0 end) as Not_True,
sum(case when v.v = 'Do not Know' then 1 else 0 end) as Do_not_Know,
sum(case when v.v is null then 1 else 0 end) as Missing
from t cross apply
(values ('Question01', Question01),
('Question02', Question02),
('Question03', Question03),
) v(q, v)
group by v.q;
我有一个 table 将调查答案存储在数据库中:
╔════════════════╦════════════════╦════════════════╗
║ Question01 ║ Question02 ║ Question03 ║
╠════════════════╬════════════════╬════════════════╣
║ Certainly True ║ Certainly True ║ Certainly True ║
║ NULL ║ Certainly True ║ NULL ║
║ Partly True ║ Partly True ║ Certainly True ║
║ Certainly True ║ Certainly True ║ Certainly True ║
║ Certainly True ║ Certainly True ║ Certainly True ║
║ Certainly True ║ Partly True ║ Certainly True ║
╚════════════════╩════════════════╩════════════════╝
我将如何在 SQL 中将它们分组以显示:
+----------------+--+--+-------------+----------+--+-------------+--
| Certainly True | Partly True | Not True | Do not Know | Missing |
+-----------------+-------------+----------+-------------+---------+
| | | | | |
| 214 | 12 | 0 | 0 | 1 |
| | | | | |
| 180 | 42 | 3 | 1 | 1 |
| | | | | |
| 223 | 2 | 0 | 1 | 1 |
| | | | | |
+-----------------+-------------+----------+--+-------------+-------
其中每一行是不同的问题,而列是该问题的答案计数。
我正在使用 SQL Manangement Studio。
请指路。谢谢
更新:我是如何解决这个问题的:
CREATE TABLE #temp1 (
Questions varchar(100),
Answers varchar(100) )
insert into #temp1 (Questions, Answers)
SELECT 'Question01' AS Questions, Question01 AS Answers FROM #Table1
UNION ALL
SELECT 'Question02' AS Questions, Question02 AS Answers FROM #Table1
UNION ALL
SELECT 'Question03' AS Questions, Question03 AS Answers FROM #Table1
SELECT Questions,
COUNT(CASE WHEN Answers = 'Certainly True' THEN 1 END) AS CertainlyTrue,
COUNT(CASE WHEN Answers = 'Partly True' THEN 1 END) AS PartlyTrue,
COUNT(CASE WHEN Answers = 'Not True' THEN 1 END) AS NotTrue,
COUNT(CASE WHEN Answers = 'Do not Know' THEN 1 END) AS DoNotKnow,
COUNT(CASE WHEN Answers IS NULL THEN 1 END) AS Missing,
COUNT(questions) AS Total
FROM #temp1
GROUP BY questions;
可能不是最优雅的方式,但它确实有效。
您可以使用:
WITH cte AS (
SELECT 'Question1' AS grp, Question1 AS Question FROM tab UNION ALL
SELECT 'Question2' AS grp, Question2 AS Question FROM tab UNION ALL
SELECT 'Question3' AS grp, Question3 AS Question FROM tab
)
SELECT grp,
COUNT(CASE WHEN Question = 'Certainly True' THEN 1 END) AS Certainly_True,
COUNT(CASE WHEN Question = 'Partly True' THEN 1 END) AS Partly_True,
...
COUNT(CASE WHEN Question IS NULL THEN 1 END) AS missing
FROM table
GROUP BY grp;
我会反转并使用条件聚合:
select v.q,
sum(case when v.v = 'Certainly True' then 1 else 0 end) as Certainly_True,
sum(case when v.v = 'Partly True' then 1 else 0 end) as Partly_True,
sum(case when v.v = 'Not True' then 1 else 0 end) as Not_True,
sum(case when v.v = 'Do not Know' then 1 else 0 end) as Do_not_Know,
sum(case when v.v is null then 1 else 0 end) as Missing
from t cross apply
(values ('Question01', Question01),
('Question02', Question02),
('Question03', Question03),
) v(q, v)
group by v.q;