数据库查询问题(100分)

  • 主题发起人 主题发起人 wjsvswjs
  • 开始时间 开始时间
W

wjsvswjs

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库包含字段a,字段b。
需要使用Quory查询为以下结果。

表内容(a,b为表中的2个字段)
a b
----------------
a11 b1
a12 b1
a11 b2
a11 b3
a11 b1
a12 b1

需要显示的结果:
序号 类型 b1 b2 b3
-----------------------------
1 a11 2 1 1
2 a12 2 0 0

请高手赐教
 
感觉有点怪怪的,能不能把你的实际问题拿出来看看?
 
用临时表吧
 
select distinct a from tablename得到a11和a12
select count(b) from tablename where a=a11 and b=b1
……
 
有點交叉表的味道,幫你提前了.
 
可以在Query中写循环自动构造列。
直接分组构造列。
var
i: integer;
FieldList:String;
begin
FieldList := TStringList.Create;
try
//用临时的Query来取得所有的列;
with tempAdoQuerydo
begin
close;
Connection := //your's connection;
SQL.text := 'select * from table group a;
Open;
first;
FieldList := '';
for i:=0 to RecordCount-1do
begin
FieldList := FieldList+'(select * from table X'+inttostr(i)+" where X'+inttostr(i)+'.a = M.a) as ['+Trim(FieldByName('b').asString)+'],';
end;
//最后将逗号去掉;
FieldList := Copy(FieldList,1,Length(FieldList)-1);
end;
finally
fieldList.Free;
end;
//构造新的Query;
with AdoQuerydo
begin
Connection := //your connection;
Close;
Sql.text := Format('SELECT (select * from table X where X.a = M.a) as 类型,%S FROM table M',
[FieldList]);
Open;
end;
//最终看到的SQL语句是这样的:
//select (select * from table X where x.a = m.a) as 类型,
//(select * from table X1 where X1.a = M.a) as B1,......from table M
//前面的序号完全可以使用IDENTITY
//drop table #temptable
//select IDENTITY(int,1,1) as 序号,TABLE.* into #temptable from TABLE
//select * from #temptable
 
问题的文字描述(假设):
有多种点心(每种数量不限),吃客随机选食(每次当然只能吃一个点心),系统记录被吃点心的名称和被吃时间。
统计:序号(自动生成)、种类(点心名称)、0点(0点内吃掉该点心的个数)、1点...23点。
本问题实际应用是物资管理的出料统计。
 
愚以为,用一条sql语句实现楼主所说的功能,怕是不可能。
由于“点心”种类恐怕不止b1,b2...几种,“吃客”也不止al1,al2两个,所以这个查询要用聚集函数,但是聚集函数产生的结果数据以一行表示一个集群,也就是一条记录。但是楼主所需要的是一个结果记录要包含3个(有几个b就有几个)聚集结果,怕是不太容易实现。
但是,倘若使用多条sql语句,或者使用编程的方法,可以生成这样的结果记录集。
并且,用聚集函数可以生成到以下程度:
语句:
SELECT a, count( b )
FROM 表名
GROUP BY a,b order by a,b
结果:
a count( b )
---------------------
a1 2 //a1中 b1出现的次数
a1 1 //a1中 b2出现的次数
a1 3 ................
a2 1 //a2中b1出现的次数
a2 1 .............
这个不受a1个数和b1个数的限制。但是结果是竖排的,而且不直观,但是数据都出来了。
如果谁有更好的方法,请赐教。
 
select a,count(b) from tbl_zzj4
group by a,b 这是得到数据的。 不过如果要排成你需要的网格样子就要费工夫了,
我看看
 
好像跟如下的问题相似吗:
如何用 DBGRID 显示形如下表的查询库存结果:
____________________________________
| 款号 | S | M | L | XL | XXL |小计|
| 1001 | 2 | | 3 | 3 | | 8 |

其中的表头S M L XL XXL 要求是从码数表(msb.db)中获取,统计的数据从库存表(store.db)中获得,数据为0不显示。
msb.db store.db
___________ __________________
| BH | CC | | KH | CC | SL |
| 1 | S | | 1001 | S | 2 |
| 2 | M | | 1001 | L | 3 |
| 3 | L | | 1001 | XL | 3 |
| 4 | XL |
| 5 | XXL|
KH=款号
BH=编号 CC=尺寸
CC=尺寸 SL=数量
 
谁说delphi不行了?看看delphi8吧,无论功能、外观上类似c#,更要命的是他更小,配置更简单,我但是用c#是因为delphi的web开发太痛苦了,现在好了嘿嘿。
 
一个简单的方法:
select a,count( case when b='b1' then
1 else
null end),count(case when b='b2' then
1 else
null end),count( case when b='b3' then
1 else
null end)
from table group by a
解法来自 gcdzsf (delphi窑洞)
但是这个方法用在SQL Sever2000可以,不能用在Access,郁闷
 
多人接受答案了。
 
后退
顶部