select a.id1,b.id2 from a,b where a.id2=b.id1select a.id1,b.id2 from a,b where a.id3 in (select distinct b.id3 from b) select a.id1,b.id2 from a,b,c where a.id4=c.id9 and b.id3='aaa'

解决方案 »

  1.   

    t-sql中,交叉查询用cross join但一般不会使用这种查询,多用inner join和outer join
      

  2.   

    有这样一个表table
    type  产品类型
    in_date  入库日期
    vendor  供应商
    pcs  数量
    __________________________________________
    type   in_date      vendor   pcs
    a1    2003/01/01     yy       1
    a1    2003/01/02     yy       1
    a1    2003/01/03     qq       1


    b1    2003/03/02     yy       1

    b1    2003/03/10     jm       1

    要得到如下表:type    yy   qq    ...
    ----------------------
    a1      2     4    ...
    b1      3     1    ...
    ...     ...   ...  ...
    注意:在sql server中运用,而不是在access中用,transform ...pivot不行.help!!help!!
      

  3.   

    declare @sql varchar(8000)
    set @sql = 'select type,'select @sql = @sql + 'sum(case vendor when '''+vendor+''' then pcs else 0 end) '+vendor+','
      from (select distinct vendor from 这样一个表) aselect @sql = left(@sql,len(@sql)-1) + ' from 这样一个表 group by type'exec(@sql)
    go
      

  4.   

    select type,sum(case vendor when 'dd' then pcs else 0 end) dd,sum(case vendor when 'yy' then pcs else 0 end) yy from tablename group by type
    大力厉害
      

  5.   

    有点辜负了大力的好意,有点看不懂(我的水平还很差),司令的看的懂,但我的vendor不是固定的,可能是两个,三个,也可能更多,这个sql语句是在vb代码中完成的,要set rs=cnn.execute(sql),行不行?/
      

  6.   


    sql = "select unit ,sum(case goodsj when '" & 水果& "' then weight else 0 end )  as 水果,sum(case goodsj when '" & 蔬菜& "' then weight else 0 end ) as 蔬菜 from tj group by unit"Set rs = cnn.Execute(sql)
    Adodc1.CommandType = adCmdText
    Adodc1.RecordSource = sql
    Adodc1.Refresh
    DataGrid1.Refresh错误提示:
    语法错误,操作符丢失,在查询表达式sum(case goodsj when '' then weight else 0 end ) 中,
      

  7.   

    CSDN - 技术频道 - 文档中心 - Visual Basic      
      
    标题     SqlServer如何生成动态交叉表查询    fuxc(原作) 
      
    关键字     交叉表 SQL 存储过程 
      
    VB+MS SqlServer,是我们目前开发数据库应用系统最常用的模式,翻翻以前的老帖子,有一些SqlServer的问题经常被提出来,但正确解答甚少,现把我对这些问题的见解贴出来,这次先讲讲动态交叉表的问题为了说明问题,我们用SqlServer自带的事例数据库(Northwind)来进行验证,所有的例子请放到Northwind中运行,我可能会省略Use语句,所引用的表,都是Northwind中的,下面我就不再说明了我这里指的交叉表,就是象Access的交叉表查询一样的效果,比如Employees表中City字段代表了城市的名称,TitleOfCourtesy代表称呼,我们希望按照City和TitleOfCourtesy的情况来统计ReportsTo字段的合计数(本统计没有任何实际意义,只是挑选一些记录包含重复内容的字段来说明情况),并显示成以下格式:(TitleOfCourtesy作为行,City作为列)TitleOfCourtesy LondonCity RedmondCity SeattleCity 
    Dr.       
    Mr. 12     
    Mrs.   2   
    Ms. 5   4 探讨这个问题之前,我们首先来看一下如何建立静态的交叉表,也就是说列数固定的交叉表,这种情况其实只要一句简单的Select查询就可以搞定:SELECT TitleOfCourtesy, 
      SUM(CASE City WHEN 'London' THEN ReportsTo ELSE NULL END) AS [London City], 
     SUM(CASE City WHEN 'Redmond' THEN ReportsTo ELSE NULL END) AS [Redmond City], 
     SUM(CASE City WHEN 'Seattle' THEN ReportsTo ELSE NULL END) AS [Seattle City]
    FROM Employees GROUP BY TitleOfCourtesy其中利用了CASE语句判断,如果是相应的列,则取需要统计的ReportsTo数值,否则取NULL,然后再合计
    其中有两个常见问题说明一下:
    a、用NULL而不用0是有道理的,假如用0,虽然求和函数SUM可以取到正确的数,但类似COUNT函数(取记录个数),结果就不对了,因为Null不算一条记录,而0要算,同理空字串("")也是这样,总之在这里应该用NULL,这样任何函数都没问题。b、假如在视图的设计界面保存以上的查询,则会报错“没有输出列”,从而无法保存,其实只要在查询前面加上一段:Create View ViewName AS ...,ViewName是你准备给查询起的名称,...就是我们的查询,然后运行一下,就可以生成视图了,对于其他一些设计器不支持的语法,也可以这样保存。以上查询作用也很大,对于很多情况,比如按照季度统计、按照月份统计等列头内容固定的情况,这样就行了,但往往大多数情况下列头内容是不固定的,象City,用户随时可能删除、添加一些城市,这种情况,我们就需要用存储过程来解决:总体思路其实很简单,首先检索列头信息,形成一个游标,然后遍历游标,将上面查询语句里Case判断的内容用游标里的值替代,形成一条新的Sql查询,然后执行,返回结果,就可以了,以下是我写的一个存储过程,供大家参考:CREATE procedure CorssTab 
    @strTabName as varchar(50) = 'Employees', --此处放表名
    @strCol as varchar(50) = 'City',                       --表头分组依据字段
    @strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段
    @strNumber as varchar(50) = 'ReportsTo',    --被统计的字段
    @strSum as varchar(10) = 'Sum'                     --运算方式
    ASDECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
    EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
    begin
      SET nocount ON 
      SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段  OPEN corss_cursor
      while (0=0)
      BEGIN
        FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
        INTO @strTmpCol
        if (@@fetch_status<>0) break
              SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
      END
            SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾  EXECUTE(@strsql) --执行
      IF @@error <>0 RETURN @@error --如果出错,返回错误代码
      CLOSE corss_cursor 
      DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功end
    GO几点说明:
    a、这是一个通用存储过程,使用时@strTabName、@strCol、@strGroup、@strNumber、@strSum几个变量设置一下就可以用到其他表上,其中结果集的第二列我加了个合计列
    b、为了测试方便,我在存储过程中设置了默认值,就是前面提到的Employees表,这样直接运行时就可以出来我上面提到的结果。
    c、使用时,可以把上面的代码复制到企业管理器的查询设计界面Sql窗格,或者查询分析器里运行一下(注意正确选择NorthWind数据库),就可以生成一个存储过程:CorssTab,然后直接运行CorssTab,如果出现本文前面类似的窗格,就表示运行成功了。
    d、假如用于其它表,首先需要在你的用户数据库里生成此存储过程(当然也可以放到Master里,然后再加个变量:@DataBase,赋值为数据库名称,然后在上面代码打开指定数据库,这样所有的数据库都可以调用它),当你调用时,采取以下格式:CorssTab @strTabName = 'Orders', @strCol = 'DATEPART(yy, OrderDate)',@strGroup = 'CustomerID', @strNumber = 'OrderID', @strSum = 'Count'上面这条语句统计了NorthWind中Orders表里每个客户年度订单数量,大家可以运行试一下效果,虽然列头显示的名称不恰当,但基本效果出来了,相信大家通过对我的代码再作简单修改,可以达到满意的交叉表效果。下次我再讲讲,如何给查询的记录集自动加行号  
      

  8.   

    刚才搞错了,我已经解决了,现在就剩goodsj的变化了,