有两个表
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 ---将上面两个查询结果统一????????
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 ---将上面两个查询结果统一????????
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
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
赞同,将两个left Join 就是你要的结果了!
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
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
两个实现的效果一样