【问题标题】:Can I count a certain Scenario in SQL Server?我可以在 SQL Server 中计算某个场景吗?
【发布时间】:2016-06-27 00:13:52
【问题描述】:

我有一张像这样的表

ID | I  | II | III | IV | V  |
===============================
1  | 1  | 0  | NULL|NULL|NULL|
2  |NULL|NULL|NULL | 0  |  1 |
3  | 1  |  0 |  0  |NULL|NULL|
4  |NULL|NULL|NULL |NULL| 1  |
.    .     .    .    .    .
.    .     .    .    .    .  
.    .     .    .    .    .

我使用的是 SQL Server 2014。

我正在计算具有 #1 和 #3 等场景的 ID 数量。有没有可以做到这一点的查询?谢谢!

【问题讨论】:

  • “像#1 和#3 这样的场景”是什么意思?所有列中的值完全相同?
  • 我的意思是我想计算在某个阶段有值但以NULL结尾的人数。与#1 一样,它在第一阶段和第二阶段具有值,但在接下来的阶段中为“NULL”。如果一个特定的 ID 以 'NULL' 开头但以一个值结尾,我不在乎。使用您提供的查询,我是否需要在查询中指定所有可能性?在我的表中,可能存在一些数据,如下所示,ID |我 |二 |三 |四 |五 | 5 |空|空 | 0 | 1 |空 | 6 | 1 | 0 | 0 | 1 |空 | . . .我会关心#5,而不是#6

标签: sql sql-server sql-server-2014


【解决方案1】:

SELECT COUNT(ID) FROM YourTabel WHERE ISNULL(I,-1)!=-1

描述:I 是您的列名,您可以在 where 条件下指定更多列。

【讨论】:

  • 你能给我解释一下 ISNULL(I,-1)!=-1 部分吗?谢谢。
  • 这在逻辑上与select count(*) from YourTable where I is not null;相同,但不建议这样做。
  • 当您在 where 条件下比较 null 时,它会将所有内容都转换为 null,所以我使用 ISNULL(I,-1) 表示当 Column I =-1 时返回 -1 然后比较 ISNULL(I, -1) 使用 -1 如果它找到 Null 它将返回 -1 所以条件为真并且它不会被计数
【解决方案2】:

我猜当您编写 #1 和 #3 之类的场景时,您的真正意思是要计算值等于第 1 行 行的行3 有。如果是这样的话,你会做这样的事情。

select count(*)
from YourTable
where (I = 1
        and II = 0
        and III is null
        and IV is null
        and V is null)
    or (I = 1
        and II = 0
        and III = 0
        and IV is null
        and V is null);

或者,您可以将上述查询简化为以下形式:

select count(*)
from YourTable
where (I = 1
        and II = 0
        and (III = 0 or III is null)
        and IV is null
        and V is null);

也许你正在寻找这样的东西:

select *
from YourTable
where coalesce(I, II, III, IV, V) is not null;

或者这个:

select
    ValidCnt = sum(case
        when coalesce(I, II, III, IV, V) is not null then 1
        else 0
        end),
    InvalidCnt = sum(case
        when coalesce(I, II, III, IV, V) is null then 1
        else 0
        end)
from YourTable;

【讨论】:

  • 我的意思是我想计算在某个阶段有值但以NULL结尾的人数。与#1 一样,它在第一阶段和第二阶段具有值,但在接下来的阶段中为“NULL”。如果一个特定的 ID 以 'NULL' 开头但以一个值结尾,我不在乎。使用您提供的查询,我是否需要在查询中指定所有可能性?在我的表中,可能存在如下数据,ID |我 |二 |三 |四 |五 | 5 |空|空 | 0 | 1 |空 | 6 | 1 | 0 | 0 | 1 |空 | . . .我会关心#5,而不是#6
  • 如果您只关心某些内容以非空值开头。换句话说,我必须有一个非空值才能让你关心,那么我认为你必须做的就是像这样select count(*) from YourTable where I is not null;
  • 我只关心以 NULL 结尾的东西,但 NULL 不必在特定列。
  • 我需要为非空的列吗?
  • 不,任何列都不必非空。有没有办法实现我的目标?
【解决方案3】:

希望这会有所帮助,

CREATE TABLE Joe ( ID INT , I int NULL, II int NULL, III int NULL, IV int NULL, V int NULL)

INSERT INTO Joe VALUES (1, 1, 0, NULL, NULL, NULL)
INSERT INTO Joe VALUES (2, NULL, NULL, NULL, 0, 1)
INSERT INTO Joe VALUES (3, 1, 0, 0, NULL, NULL)
INSERT INTO Joe VALUES (4, NULL, NULL, NULL, NULL, 1)

-- SELECT * FROM Joe

SELECT J.* FROM Joe J
JOIN
  ( SELECT J.ID,Count(0) Counter FROM Joe J WHERE J.I IS NOT NULL
     AND J.V IS NULL
   GROUP BY J.Id) JoeCounts ON J.Id = JoeCounts.Id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多