【问题标题】:SQL - First Select with Score than with NULLSQL - 首先选择分数而不是 NULL
【发布时间】:2018-03-20 08:34:19
【问题描述】:

我需要选择并合并按活动分数排序的记录。我有一个适用于所有有分数的记录的解决方案。现在我需要用没有分数且数据为空的记录填充选择。 以下语句适用于有分数且需要扩展的记录:

SELECT 
Name, Activityscore
FROM 
(SELECT
TOP 2084 * FROM [Table] 
WHERE Email like '%@test%' AND Activityscore in ( 1, 2, 3, 4)
order by Activityscore desc ) t1
UNION 
SELECT
Name, Activityscore

    SELECT 
    Name, Activityscore
    FROM 
    (SELECT
    TOP 2084 * FROM [Table] 
    WHERE Email like '%@test%' AND Activityscore in ( 1, 2, 3, 4) OR Email like '%@test%' AND Activityscore is NULL
    order by Activityscore desc ) t1
    UNION 
    SELECT
    Name, Activityscore
    FROM
    (SELECT
    TOP 14000 * FROM [Table] 
    WHERE Email NOT like '%@test%' AND Email NOT like '%@test2%' AND Activityscore in ( 1, 2, 3, 4) OR Email NOT like '%@test%' AND Email NOT like '%@test2%' AND Activityscore is NULL
    order by Activityscore desc ) t2
FROM
(SELECT
TOP 14000 * FROM [Table] 
WHERE Email NOT like '%@test%' AND Email NOT like '%@test2%' AND Activityscore in ( 1, 2, 3, 4)
order by Activityscore desc ) t2

编辑:

我们有一个包含用户的列表。他们中的一些人有分数,有些人没有。目标是首先选择所有得分从 4 到 3 到 2 到 1 的人。此函数与示例 sn-p 一起使用。现在我需要用没有分配任何分数的记录来填充这些记录。例如:我有一个包含 10.000 条记录的表。 5.000 有分数 (1-4),5.000 没有。现在我需要选择 8.000,因此该语句需要首先选择所有 5.000 的分数,然后随机选择其余的(3.000)没有分数。希望清除用例。

以下似乎带来了预期的结果:

【问题讨论】:

  • 标记您正在使用的 dbms。该查询是特定于产品的。
  • 这里的示例数据有很长的路要走。
  • 嗨,蒂姆,你到底​​是什么意思?
  • 他的意思是添加一些示例数据,以便我们可以看到您的数据是什么样的以及您希望它是什么样的,以便可以测试和验证任何解决方案。
  • 能否请您发布一些示例数据和预期结果

标签: sql sql-server-2005


【解决方案1】:

这个怎么样 -

SELECT 
Name, Activityscore
FROM 
(SELECT
TOP 2084 * FROM [Table] 
WHERE Email like '%@test%' AND Activityscore in ( 1, 2, 3, 4, NULL, '')
order by Activityscore desc ) t1
UNION 
SELECT
Name, Activityscore
FROM
(SELECT
TOP 14000 * FROM [Table] 
WHERE Email NOT like '%@test%' AND Email NOT like '%@test2%' AND 
Activityscore in ( 1, 2, 3, 4, NULL, '')
order by Activityscore desc ) t2

【讨论】:

  • 这并没有带来预期的结果,而是只选择了 6.500 条记录。
  • 这也没有带来预期的解决方案。
  • 这不会选择没有分数的记录
【解决方案2】:

我也尝试了以下但没有得到预期的回复

SELECT 
Name, Activityscore
FROM 
(SELECT
TOP 2084 * FROM [Table] 
WHERE Email like '%@test%' AND Activityscore in ( 1, 2, 3, 4) OR Activityscore is NULL
order by Activityscore desc ) t1
UNION 
SELECT
Name, Activityscore
FROM
(SELECT
TOP 14000 * FROM [Table] 
WHERE Email NOT like '%@test%' AND Email NOT like '%@test2%' AND Activityscore in ( 1, 2, 3, 4) OR Activityscore is NULL
order by Activityscore desc ) t2

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多