我有一个包含调查结果的表格:
submitter issue q1 q2 q3 q4 q5
mike 11557 4 3 4 5 1
mark 13554 5 5 5 5 5
luke 15110 1 1 1 1 1
luke 15110 1 1 1 1 1
donald 16900 4 2 2 4 5
joe 11562 5 5 5 5 5
joe 11562 5 5 5 5 5
sam 12485 2 3 4 3 4
sam 12485 2 3 4 3 4
sam 12485 2 3 4 3 4
我希望能够过滤掉多个提交并仅计算其中 1 个。 有些人提交了三四次。
我知道如何查明调查的提交次数和提交者:
SELECT
submitter
,issue
,COUNT(*) as '# of times Survey submitted'
FROM
Survey
GROUP BY
submitter, issue
HAVING
COUNT(*) > 1
但是,我不确定如何使用此查询来过滤掉多个提交。
我正在使用的当前查询是:
SELECT 'Question #1' as 'Survey Question'
,CAST(CAST(SUM(q1) AS float)/COUNT(q1) AS decimal (4,2)) as 'Average Score'
FROM Survey
WHERE COALESCE(q1,q2,q3,q4,q5) IS NOT NULL
UNION ALL
SELECT 'Question #2' as 'Survey Question'
,CAST(CAST(SUM(q2) AS float)/COUNT(q2) AS decimal (4,2)) as 'Average Score'
FROM Survey
WHERE COALESCE(q1,q2,q3,q4,q5) IS NOT NULL
UNION ALL
etc...
期望的结果是:(注意:这个结果集不准确。只是我想要的格式。)
Survey Question Average Score
Question #1 4.58
Question #2 4.80
Question #3 4.60
Question #4 4.59
Question #5 4.64
谁能提供线索吗?
非常感谢!
最佳答案
我认为我的数学是正确的,但我的结果与你的不完全匹配。您确定您想要的结果是正确的吗?
DECLARE @yourTable TABLE (submitter VARCHAR(10), Issue INT, q1 TINYINT, q2 TINYINT,q3 TINYINT, q4 TINYINT,q5 TINYINT);
INSERT INTO @yourTable
VALUES ('mike',11557,4,3,4,5,1),
('mark',13554,5,5,5,5,5),
('luke',15110,1,1,1,1,1),
('luke',15110,1,1,1,1,1),
('donald',16900,4,2,2,4,5),
('joe',11562,5,5,5,5,5),
('joe',11562,5,5,5,5,5),
('sam',12485,2,3,4,3,4),
('sam',12485,2,3,4,3,4),
('sam',12485,2,3,4,3,4);
WITH CTE_Distinct
AS
(
SELECT DISTINCT *
FROM @yourTable --just change this to your actual table name.
)
SELECT REPLACE(question,'q','Question #') AS [Survey Question],
CAST(AVG(val * 1.0) AS DECIMAL(4,2)) AS [Average Score]
FROM CTE_Distinct
UNPIVOT
(
val FOR question IN (q1,q2,q3,q4,q5)
) unpvt
GROUP BY question
结果:
Survey Question Average Score
-------------------- ---------------------------------------
Question #1 3.50
Question #2 3.17
Question #3 3.50
Question #4 3.83
Question #5 3.50
关于sql - 如何过滤掉特定列下具有重复值的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30329077/