找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 6260|回复: 20

[求助] 请求超级高手帮我写一条SQL语句,万分感谢!

  [复制链接]
发表于 2010-6-8 17:52:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

×
本帖最后由 davyxjc 于 2010-6-9 14:44 编辑

在数据库中以下记录:
存货编号       供应商         价格
04-0010-01     A               0.5
04-0010-01     B               0.6
04-0020-01     A               1.0
04-0020-01     B               1.1
04-0020-01     C               1.2
我要查询的结果如下:
存货编号      供应商A价格    供应商B价格  供应商C价格
04-0010-01    0.5             0.6
04-0020-01    1.0             1.1          1.2

请问怎样写SQL语句?
未命名1.JPG
发表于 2010-6-8 20:53:05 | 显示全部楼层
路过,看看能否长点见识
发表于 2010-6-9 08:44:56 | 显示全部楼层
本帖最后由 naojin 于 2010-6-9 08:46 编辑

select 存货编号,case when 供应商 ='A' then  isnull(sum(价格),0) end  供应商 A ,case when 供应商 ='B' then  isnull(sum(价格),0) end  供应商 B...
from ...
group by 存货编号,供应商
发表于 2010-6-9 09:53:59 | 显示全部楼层



    写得不错,但应该是sum(isnull(价格,0)) 而不是 isnull(sum(价格),0)
发表于 2010-6-9 10:55:34 | 显示全部楼层
回复 4# 一哂而过


    你试试就知道了
 楼主| 发表于 2010-6-9 13:57:40 | 显示全部楼层
A,B,C供应商,只是举例子,完成有可能不知道供应商是谁,请问怎样写?
 楼主| 发表于 2010-6-9 14:45:01 | 显示全部楼层
如上图所示,怎样写SQL语句?
发表于 2010-6-10 09:44:13 | 显示全部楼层
本帖最后由 中文网 于 2010-6-10 09:50 编辑

不知道多少个供应商就用循环来写:

  1. DECLARE @cust_nm VARCHAR(20) --供应商名称
  2. DECLARE @sql VARCHAR(2000) --拼sql语句

  3. SET @sql = 'SELECT [存货编号] '

  4. DECLARE c11 CURSOR FOR
  5. SELECT DISTINCT [供应商] FROM [表] ORDER BY [供应商]

  6. OPEN c11
  7. FETCH NEXT FROM C11 INTO
  8.       @cust_nm


  9. IF @@FETCH_STATUS<>0
  10. BEGIN
  11.      DEALLOCATE c11     
  12.      RAISERROR('没有记录',16,-1)
  13.      RETURN
  14. END


  15. WHILE (@@FETCH_STATUS = 0)
  16. BEGIN
  17.      SET @sql = @sql+',SUM(CASE WHEN [供应商]='+CHAR(39)+@cust_nm+CHAR(39) +'THEN [价格] ELSE 0)'

  18.      FETCH NEXT FROM C11 INTO
  19.            @cust_nm
  20. END
  21. DEALLOCATE C11

  22. SET @sql = @sql+' from [表] group by [存货编号],[供应商]'

  23. exec (@sql)
复制代码

评分

参与人数 1威望 +10 金币 +50 魅力 +10 收起 理由
yifeng651 + 10 + 50 + 10 精品文章

查看全部评分

 楼主| 发表于 2010-6-10 11:53:41 | 显示全部楼层
我按楼上的语句,改成了如下,但运行时提示第一行有错误?

DECLARE @cust_nm VARCHAR(20)
DECLARE @sql VARCHAR(2000)
SET @sql = 'SELECT cinventory '
DECLARE c11 CURSOR FOR
SELECT DISTINCT cvencode FROM po_pomain ORDER BY cvencode
OPEN c11
FETCH NEXT FROM C11 INTO
      @cust_nm
IF @@FETCH_STATUS<>0
BEGIN
     DEALLOCATE c11     
     RAISERROR('没有记录',16,-1)
     RETURN
END
WHILE (@@FETCH_STATUS = 0)
BEGIN
     SET @sql = @sql+',SUM(CASE WHEN cinvcode='+CHAR(39)+@cust_nm+CHAR(39) +'THEN iunitprice ELSE 0)'
     FETCH NEXT FROM C11 INTO
           @cust_nm
END
DEALLOCATE C11
SET @sql = @sql+' from po_podetails group by cinvcode,cvencode'
exec (@sql)
发表于 2010-6-10 13:04:16 | 显示全部楼层
不错,可以收藏
发表于 2010-6-11 10:24:54 | 显示全部楼层
本帖最后由 中文网 于 2010-6-11 10:26 编辑

你可以 将@sql打印出来(print @sql),再将打印出的内容直接执行试试。如果你的供应商很多的话,DECLARE @sql VARCHAR(2000)  2000的长度可能不够,增加长度试试。另外 ,在 SET @sql = @sql+',SUM(CASE WHEN cinvcode='+CHAR(39)+@cust_nm+CHAR(39) +'THEN iunitprice ELSE 0)' 这一句后面可以增加一个字段名

SET @sql = @sql+',SUM(CASE WHEN cinvcode='+CHAR(39)+@cust_nm+CHAR(39) +'THEN iunitprice ELSE 0) as'+@cust_nm
发表于 2010-6-12 21:57:01 | 显示全部楼层
嗯高手,记下以后使用。
发表于 2010-6-13 10:13:37 | 显示全部楼层
select 存货编号,case when 供应商 ='A' then  isnull(sum(价格),0) end  供应商 A ,case when 供应商 ='B' then  isnull(sum(价格),0) end  供应商 B...
from ...
group by 存货编号,供应商
发表于 2010-6-13 16:35:33 | 显示全部楼层
高手始终是高手
发表于 2010-6-14 07:58:32 | 显示全部楼层
这个我面试。NET软件软件开发的时候就有这样的题目!
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-6-5 07:05 , Processed in 0.035086 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表