none
SQL语句请教 RRS feed

  • 问题

  • 表A
    客户名称             购买商品名称
    1000000               康师傅方便面
    1000000               统一鲜橙多
    1000000               双汇火腿肠
    1000001               雅培奶粉
    1000001               康师傅方便面
    1000001               统一鲜橙多
    1000001               双汇火腿肠


    如何使用Sql语句查得买且只买了“康师傅方便面,统一鲜橙多,双汇火腿肠”的客户名称1000000


    guiwenyang
    2009年10月15日 9:02

答案

  • 
    create table 表A(
    客户名称 varchar(10),购买商品名称 varchar(20))
    go
    insert 表A(客户名称,购买商品名称) values('1000000','康师傅方便面')
    insert 表A(客户名称,购买商品名称) values('1000000','统一鲜橙多')
    insert 表A(客户名称,购买商品名称) values('1000000','双汇火腿肠')
    insert 表A(客户名称,购买商品名称) values('1000001','雅培奶粉')
    insert 表A(客户名称,购买商品名称) values('1000001','康师傅方便面')
    insert 表A(客户名称,购买商品名称) values('1000001','统一鲜橙多')
    insert 表A(客户名称,购买商品名称) values('1000001','双汇火腿肠')
    insert 表A(客户名称,购买商品名称) values('1000002','统一鲜橙多')
    insert 表A(客户名称,购买商品名称) values('1000002','双汇火腿肠')
    go
    select [客户名称] from [表A] where [购买商品名称] in 
    ('康师傅方便面','统一鲜橙多','双汇火腿肠') 
    and 客户名称 not in
    (
    select [客户名称] from [表A] where [购买商品名称] not in 
    ('康师傅方便面','统一鲜橙多','双汇火腿肠') group by 客户名称
     having count(1)>0
    )
    group by 客户名称 having count(1)=3 
    

    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    • 已建议为答案 肖小勇 2009年10月15日 10:10
    • 已标记为答案 guiwenyang 2009年10月16日 5:19
    2009年10月15日 9:27

全部回复

  • 
    create table 表A(
    客户名称 varchar(10),购买商品名称 varchar(20))
    go
    insert 表A(客户名称,购买商品名称) values('1000000','康师傅方便面')
    insert 表A(客户名称,购买商品名称) values('1000000','统一鲜橙多')
    insert 表A(客户名称,购买商品名称) values('1000000','双汇火腿肠')
    insert 表A(客户名称,购买商品名称) values('1000001','雅培奶粉')
    insert 表A(客户名称,购买商品名称) values('1000001','康师傅方便面')
    insert 表A(客户名称,购买商品名称) values('1000001','统一鲜橙多')
    insert 表A(客户名称,购买商品名称) values('1000001','双汇火腿肠')
    insert 表A(客户名称,购买商品名称) values('1000002','统一鲜橙多')
    insert 表A(客户名称,购买商品名称) values('1000002','双汇火腿肠')
    go
    select [客户名称] from [表A] where [购买商品名称] in 
    ('康师傅方便面','统一鲜橙多','双汇火腿肠') 
    and 客户名称 not in
    (
    select [客户名称] from [表A] where [购买商品名称] not in 
    ('康师傅方便面','统一鲜橙多','双汇火腿肠') group by 客户名称
     having count(1)>0
    )
    group by 客户名称 having count(1)=3 
    

    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    • 已建议为答案 肖小勇 2009年10月15日 10:10
    • 已标记为答案 guiwenyang 2009年10月16日 5:19
    2009年10月15日 9:27
  • 如果表A中还有如下记录
    1000003      统一鲜橙多
    就不对了吧
    guiwenyang
    2009年10月15日 11:26
  • select 客户名称
        from dbo.表A
        group by 客户名称
        having count(*)=3
        and exists(select 客户名称 from dbo.表A where 购买商品名称='康师傅方便面')
        and exists(select 客户名称 from dbo.表A where 购买商品名称='统一鲜橙多')
        and exists(select 客户名称 from dbo.表A where 购买商品名称='双汇火腿肠')

    试试这个
    2009年10月15日 12:01
  • select [客户名称]
    from [表A] 
    group by [客户名称]
    having 
    	--只买了3种
    	count(distinct [购买商品名称])=3 
       and 
    	--3种都符合要求
    	sum(
    	     case when 购买商品名称 in ('康师傅方便面','统一鲜橙多','双汇火腿肠') 
    		then 0 
    		else 1 
    	     end
    	)=0
    
    2009年10月15日 12:06
    版主
  • 如果表A中还有如下记录
    1000003      统一鲜橙多
    就不对了吧
    guiwenyang

    是对的~~~~你可以按照我那个方法试下
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年10月15日 16:39
  • 非常感谢大家,谢谢!这真是个藏龙卧虎的好地方,谢谢谢谢!
    guiwenyang
    2009年10月16日 5:19