有两个表
card表
表名
列名 数据类型(精度范围) 空/非空 约束条件 其他说明
CardId int 非空 卡片id
CardTypeId int 非空 表CardType中CardTypeId的外键 卡片类型id
CardNo bigint 非空 卡片序号
CardPassword int 非空 卡片密码
CardDesc Varchar(50) 卡片描述
CardTime datetime 非空 添加卡片时间
CardState int 非空 表CardState中CardStateId的外键 卡片售出状态
cardtype表表名
列名 数据类型(精度范围) 空/非空 约束条件 其他说明
CardTypeId int 非空 卡片类型id
CardTypeName Varchar(50) 非空 卡片类型名称
CardPrice int 非空 卡片价格
CardImage Varchar(50) 对应图片地址现在希望用一个复杂的sql 语句或着一个存储过程
实现

cardtypeid  cardtypename cardPriceint 总数 售出 剩余
xx               xx         xx         xx   xx   xx一个一个查我知道,现在想一起查出来,看似很简单但是很棘手
小弟写了两个
---先查询出所有卡的信息{总数}SELECT     card.cardtypeid, dbo.CardType.CardTypeName, count(*) as '总数'
FROM         dbo.CardType INNER JOIN
                      dbo.Card ON dbo.CardType.CardTypeId = dbo.Card.CardTypeId group by Card.cardtypeid,cardtype.cardtypeName,card.cardtypeid--根据cardtypeid查出已售出情况在card里查询
select cardtypeid, count(cardtypeid) as '售出' from card where cardstate=1  group by cardtypeid ---将上面两个查询结果统一????????

解决方案 »

  1.   

    两个left join 不就行了?
      

  2.   

    SELECT    card.cardtypeid, dbo.CardType.CardTypeName, 
    count(distinct CardType.CardTypeId) as '总数',
    Sum(case when cardstate=1 then 1 else 0 end)
    FROM        dbo.CardType 
    INNER JOIN 
    dbo.Card ON dbo.CardType.CardTypeId = dbo.Card.CardTypeId 
    group by Card.cardtypeid
      

  3.   

    SELECT    card.cardtypeid, dbo.CardType.CardTypeName, 
    count(distinct CardType.CardTypeId) as '总数',
    Sum(case when cardstate=1 then 1 else 0 end) as '售出',
    剩余=(count(distinct CardType.CardTypeId)-Sum(case when cardstate=1 then 1 else 0 end))
    FROM        dbo.CardType 
    INNER JOIN 
    dbo.Card ON dbo.CardType.CardTypeId = dbo.Card.CardTypeId 
    group by Card.cardtypeid
      

  4.   


    赞同,将两个left Join 就是你要的结果了!
      

  5.   

    直接进行一次left join 然后用聚合函数就可以了吧。
      

  6.   

    对三楼的代码简单的修改,达到效果....非常感谢! SELECT    card.cardtypeid, dbo.CardType.CardTypeName, 
    count( CardType.CardTypeId) as '总数',
    Sum(case when cardstate=1 then 1 else 0 end) as '售出',
    剩余=(count( CardType.CardTypeId)-Sum(case when cardstate=1 then 1 else 0 end))
    FROM        dbo.CardType 
    INNER JOIN 
    dbo.Card ON dbo.CardType.CardTypeId = dbo.Card.CardTypeId 
    group by Card.cardtypeid ,cardtype.cardtypename  另外贴出一个复杂的,也可以达到效果:select distinct  cardTypeName=+(select cardtypename from cardtype where cardtype.cardtypeid=card.cardtypeid),cardprice =+(select cardprice from cardtype where cardtype.cardtypeid=card.cardtypeid),总数=+(select count (*) from card where cardtype.cardtypeid=card.cardtypeid ),出售=+(select count (*) from card where cardstate=1 and cardtype.cardtypeid=card.cardtypeid ),剩余=+(select count (*) from card where cardstate=0 and cardtype.cardtypeid=card.cardtypeid)from card,cardtype where cardtype.cardtypeid=card.cardtypeid  
      

  7.   

    终结版的:---销售统计分析(cardtypeid ,cardtypename,总数,售出,剩余)
    SELECT     card.cardtypeid, dbo.CardType.CardTypeName, count(*) as '总数',sum (cardstate)as '售出','剩余'=sum(case when cardstate=0 then 1 else 0 end)
    FROM         dbo.CardType INNER JOIN
                          dbo.Card ON dbo.CardType.CardTypeId = dbo.Card.CardTypeId group by Card.cardtypeid,cardtype.cardtypeName,card.cardtypeid
    --联表查询,我发现聚合函数的用法很多,不一定非要跟group by 一起用
    如:
    select count(*) from card group by cardtypeidselect (select count(*) from card where card.cardtypeid=cardtype.cardtypeid) from cardtype
    两个实现的效果一样