sql - 如何过滤掉特定列下具有重复值的数据?

标签 sql sql-server-2012 survey

我有一个包含调查结果的表格:

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/

相关文章:

sql - 如果列存在则使用列值

sql-server - 按存在和不存在的日期获取记录

r - 在 R 中的 svyplot() 中用颜色填充气泡(调查包)

java - 设置查询参数;参数值与预期类型不匹配

mysql - 查找与特定优惠券关联的所有订单

sql - 名字应与其他名字随机匹配

javascript - 调查JS : Disabling the automatic Thank You Message in React

adsense - Google 消费者调查发布商报告仪表板?

sql - 在 PostgreSQL 中插入空值会导致错误

SQL - 如何统计每天一行中每种状态的记录?