选择其中data1和Data2为零的MSSQL

时间:2018-08-21 06:13:16

标签: sql-server where-clause

我要选择其中的行

  1. 一个ID的Data1和Data2不是0
  2. 并选择所有代码5

表1-

ID  Code    Data1       Data2
A   1           0       0
A   2           0       11.68
A   3           0.97    3.51
B   1           0       0
B   2           0.15    5.35
B   3           0.58    7.39
C   5           0       0

所以我想要输出表如下:

ID  Code    Data1   Data2
A   2       0       11.68
A   3       0.97    3.51
B   2       0.15    5.35
B   3       0.58    7.39
C   5       0       0

我写的查询如下,但是没有用,有人可以帮我吗。

select ID, CODE, DATA1, DATA2  from table1 where  (DATA1 !=0 and DATA2 !=0) or Code =5

5 个答案:

答案 0 :(得分:1)

select ID, CODE, DATA1, DATA2  from table1 a where  
a.Code = 5 OR
NOT EXISTS
(
 SELECT 1 FROM table1  b WHERE a.Id = b.Id AND b.Data1 = 0 AND b.Data2 = 0
)

答案 1 :(得分:1)

根据结果集,我可以观察到,如果Data1和Data2中的任何一个大于0,则将考虑该记录。您正在尝试使用过滤器获取数据,因为两者都不为零。使用OR运算符而不是And

select ID, CODE, DATA1, DATA2  from table1 where  (DATA1 !=0 or DATA2 !=0) or Code =5

答案 2 :(得分:1)

根据数据设置,这也将解决问题

CREATE TABLE Table1
    ([ID] varchar(1), [Code] int, [Data1] numeric(22,6), [Data2]  numeric(22,6))
;

INSERT INTO Table1
    ([ID], [Code], [Data1], [Data2])
VALUES
    ('A', 1, 0, 0),
    ('A', 2, 0, 11.68),
    ('A', 3, 0.97, 3.51),
    ('B', 1, 0, 0),
    ('B', 2, 0.15, 5.35),
    ('B', 3, 0.58, 7.39),
    ('C', 5, 0, 0)
;
select ID, CODE, DATA1, DATA2  from table1 a where  Data1 <> 0 or Data2 <> 0
or code=5

输出

ID  Code    Data1   Data2
A   2       0       11.68
A   3       0.97    3.51
B   2       0.15    5.35
B   3       0.58    7.39
C   5       0       0

答案 3 :(得分:0)

从表1中选择*,其中数据1 <> 0和数据2 <> 0或代码= 5

答案 4 :(得分:0)

希望这会有所帮助!

    CREATE TABLE #table1(ID VARCHAR(10),Code INT,Data1 float,Data2 float)

    INSERT INTO #table1
    SELECT 'A',1,0,0 UNION ALL
    SELECT 'A',2,0,11.68 UNION ALL
    SELECT 'A',3,0.97,3.51 UNION ALL
    SELECT 'B',1,0,0 UNION ALL
    SELECT 'B',2,0.15,5.35 UNION ALL
    SELECT 'B',3,0.58,7.39 UNION ALL
    SELECT 'C',5,0,0

    ;with cte
    AS
    (
        SELECT COUNT(*) OVER(partition by id)c,
        * from #table1
    )

    Select id,code,Data1,Data2 from cte 
    where 1=(CASE WHEN c=1 THEN 1
                  WHEN Data1<>0 or Data2 <>0 then 1
                  ELSE 0
              END)

    Drop table #table1