【问题标题】:SQL Distinct with multiple CriteriaSQL Distinct 具有多个条件
【发布时间】:2018-06-14 18:09:56
【问题描述】:

我想根据SampleData Table & Output 生成表格输出。我的 SQL 查询如下,但它没有给我最后三列的正确结果

SELECT
  UserLogin,
  COUNT(DISTINCT consumerID) AS TotalUniqueconsumerIDs,  
  COUNT(DISTINCT (CASE
        WHEN ActivitiesCompleted > 0 AND QuizCompleted <= 0 THEN consumerID END)) AS YesActivityNoQuiz,
  COUNT(DISTINCT (CASE
        WHEN ActivitiesCompleted <= 0 AND QuizCompleted > 0 THEN consumerID END)) AS NoActivityYesQuiz,  
COUNT(DISTINCT (CASE
        WHEN ActivitiesCompleted >= 1 AND QuizCompleted >= 1 THEN consumerID END)) AS YesActivityYesQuiz
FROM
  TableName
GROUP BY
  UserLogin

非常感谢任何帮助。


更多信息:

也许我上面不清楚,所以在这里提供更多信息:

我创建了另一个示例表,其中只有 1 个 UserLogin 的数据,看起来像 this,如果我在 Excel 中从外部旋转这个示例数据集,我会看到 this

如您所见,此表中的 consumerID 的透视屏幕截图都有超过 1 个 ActivitiesCompleted 和 1 QuizCompleted。

基于我上面查询的 SQL 输出看起来像 this

但是,根据 Pivot 屏幕截图,我预计 YesActivityYesQuiz 列中的值为 1,YesActivityNoQuiz 和 NoActivityYesQuiz 中的值为 0


样本数据:

Date,UserLogin,consumerID,ActivitiesCompleted,QuizCompleted
6/8/2018,aasufhar,consumerA,0,1
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,2,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,1,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerA,0,0
6/8/2018,aasufhar,consumerB,0,1
6/8/2018,aasufhar,consumerB,0,0
6/8/2018,aasufhar,consumerB,2,0
6/8/2018,aasufhar,consumerB,1,0
6/8/2018,aasufhar,consumerB,1,0
6/8/2018,aasufhar,consumerB,1,0
6/8/2018,aasufhar,consumerB,0,0
6/8/2018,aasufhar,consumerB,0,0
6/8/2018,aasufhar,consumerB,0,0
6/8/2018,aasufhar,consumerB,0,0
6/8/2018,aasufhar,consumerB,0,0

【问题讨论】:

  • 您能否发布您当前的输出,以便我们比较您得到的和需要的。
  • 我认为您的查询是正确的!是什么让你认为它返回错误的结果?它看起来对我来说是正确的。
  • @MikhailBerlyant 我编辑了我的问题并提供了更多信息
  • 图像确实隐藏了您的真实数据,因此很难判断这里出了什么问题。正如我根据您解释的逻辑所说的那样-您的查询看起来是正确的。我建议您以纯文本格式提供数据示例,以便我们为您提供进一步帮助。
  • @MikhailBerlyant 我用示例数据更新了问题

标签: sql google-bigquery ansi-sql bigquery-standard-sql


【解决方案1】:

有问题的查询对我来说似乎是正确的(至少它返回了预期结果中显示的内容)

不过,我可以提出更简洁的版本(BigQuery 标准 SQL)

#standardSQL
SELECT UserLogin, 
  COUNT(DISTINCT consumerID) AS TotalUniqueconsumerIDs,  
  COUNT(DISTINCT IF(ActivitiesCompleted > 0 AND QuizCompleted <= 0, consumerID, NULL)) AS YesActivityNoQuiz,
  COUNT(DISTINCT IF(ActivitiesCompleted <= 0 AND QuizCompleted > 0, consumerID, NULL)) AS NoActivityYesQuiz,  
  COUNT(DISTINCT IF(ActivitiesCompleted >= 1 AND QuizCompleted >= 1, consumerID, NULL)) AS YesActivityYesQuiz
FROM TableName
GROUP BY UserLogin

根据 OP 的最新示例/解释更新查询

#standardSQL
SELECT UserLogin, 
  COUNT(DISTINCT consumerID) AS TotalUniqueconsumerIDs,  
  COUNT(DISTINCT IF(ActivitiesCompleted > 0 AND QuizCompleted <= 0, consumerID, NULL)) AS YesActivityNoQuiz,
  COUNT(DISTINCT IF(ActivitiesCompleted <= 0 AND QuizCompleted > 0, consumerID, NULL)) AS NoActivityYesQuiz,  
  COUNT(DISTINCT IF(ActivitiesCompleted >= 1 AND QuizCompleted >= 1, consumerID, NULL)) AS YesActivityYesQuiz,
  COUNT(DISTINCT IF(ActivitiesCompleted <= 0 AND QuizCompleted <= 0, consumerID, NULL)) AS NoActivityNoQuiz
FROM (
  SELECT UserLogin,consumerID,
    SUM(ActivitiesCompleted) ActivitiesCompleted,
    SUM(QuizCompleted) QuizCompleted
  FROM TableName
  GROUP BY UserLogin,consumerID
)
GROUP BY UserLogin

【讨论】:

    【解决方案2】:

    也许你只想要max()

    SELECT UserLogin, COUNT(DISTINCT consumerID) AS TotalUniqueconsumerIDs,  
           MAX(CASE WHEN ActivitiesCompleted > 0 AND QuizCompleted <= 0 THEN 1 ELSE 0 END) AS YesActivityNoQuiz,
           MAX(CASE WHEN ActivitiesCompleted <= 0 AND QuizCompleted > 0 THEN 1 ELSE 0 END) AS NoActivityYesQuiz,  
           MAX(CASE WHEN ActivitiesCompleted >= 1 AND QuizCompleted >= 1 THEN 1 ELSE 0 END) AS YesActivityYesQuiz
    FROM TableName
    GROUP BY UserLogin;
    

    【讨论】:

    • 哈,在我写下我的小尝试之前,您已经编辑并回答了它。魔法!
    【解决方案3】:

    您必须在 group by 子句中包含 ActivitiesCompleted,因为您在 case 语句中使用了它。它不会让你出错?

    SELECT
      UserLogin,
      COUNT(DISTINCT consumerID) AS TotalUniqueconsumerIDs,  
      COUNT(DISTINCT (CASE
            WHEN ActivitiesCompleted > 0 AND QuizCompleted <= 0 THEN consumerID END)) AS YesActivityNoQuiz,
      COUNT(DISTINCT (CASE
            WHEN ActivitiesCompleted <= 0 AND QuizCompleted > 0 THEN consumerID END)) AS NoActivityYesQuiz,  
    COUNT(DISTINCT (CASE
            WHEN ActivitiesCompleted >= 1 AND QuizCompleted >= 1 THEN consumerID END)) AS YesActivityYesQuiz
    FROM
      TableName
    GROUP BY
      UserLogin,ActivitiesCompleted 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2014-08-01
      • 2023-04-10
      • 2017-02-24
      • 1970-01-01
      • 2021-07-26
      • 2020-12-13
      相关资源
      最近更新 更多