如何把记录作为栏位来生成数据表装进DBGIRD来看和列印 ( 积分: 180 )

  • 主题发起人 主题发起人 sandal
  • 开始时间 开始时间
S

sandal

Unregistered / Unconfirmed
GUEST, unregistred user!
A表有三个栏位,如下
工号,计件数量,日期
查看时要求以日期为栏位来看,如:
工号 01/09 02/09 03/09 04/09 05/09
A01 100 120 130 20 60
A02 50 80 150 160 90
 
A表有三个栏位,如下
工号,计件数量,日期
查看时要求以日期为栏位来看,如:
工号 01/09 02/09 03/09 04/09 05/09
A01 100 120 130 20 60
A02 50 80 150 160 90
 
用sum(case when ...else
...end) 语句试试,不过很烦了,最多的有31天里,
那位还有好的办法
 
SELECT 工号,
(SELECT 计件数量 FROM A表 WHERE 工号 = A.工号 AND 日期 = '01/09') AS '01/09',
(SELECT 计件数量 FROM A表 WHERE 工号 = A.工号 AND 日期 = '02/09') AS '02/09',
(SELECT 计件数量 FROM A表 WHERE 工号 = A.工号 AND 日期 = '03/09') AS '03/09',
(SELECT 计件数量 FROM A表 WHERE 工号 = A.工号 AND 日期 = '04/09') AS '04/09',
(SELECT 计件数量 FROM A表 WHERE 工号 = A.工号 AND 日期 = '05/09') AS '05/09'
FROM A表 A
GROUP BY 工号
 
就用上面那个大忙人说用group by 好用
 
大忙人那个方法很好,我原来作过一个按国别统计出访人数的表也是那样作的
 
谢谢, 大家的回复
不过,我的日期是没有确定的, 不知道哪天开始,也不知道哪天结束,除非再来一次 select
distinct 日期 from A表,这样之后又如何套入大忙人那条SQL里呢?
 
我试了一下,出现下面错误
服务器: 消息 512,级别 16,状态 1,行 1
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
 
建议写一个带游标的存储过程
 
用上面SQL語句的思想,在程序中動態生成SQL語句。
var
sSql : string;
begin
sSql := 'SELECT 工號, ';
q1.close;
q1.sql.clear;
q1.sql.add('SELECT distinct 日期 from A表');
q1.open;
while not q1.eofdo
begin
sSql := sSql + '(SELECT 计件数量 FROM A表 WHERE 工号 = A.工号 AND 日期 = '
+ QuotedStr(q1.fieldbyname('日期').asstring) ) +' AS '
+ QuotedStr(q1.fieldbyname('日期').asstring) + ',';
q1.next;
end;
sSql := sSql + 'FROM A表 group by 工號';
q2.close;
q2.sql.clear;
q2.sql.add(sSql);
q2.open;
end;
 
多人接受答案了。
 
后退
顶部