两个表:
表一、设备类型DeviceClass
字段1:DeviceClassID INT 主键 自增
字段2:DeviceClassName NvarChar(50) 非空
表二、设备Devic
字段1:DeviceID INT 主键 自增
字段2:DeviceName NvarChar(50) 非空
字段3:DeviceClassID 非空
想要实现的功能:
按照设备类型,分别统计出表二中各种设备的数量,并用表一中的DeviceClassName作为别名。
注:表一中的设备类型数量未知。
  偶是MsSql菜鸟一只,望详细点。

解决方案 »

  1.   

    Create proc procname
    as
     Select a.DeviceClassName,count(*) as 数量
       from DeviceClass a inner join Devic b
         on a.DeviceClassID=b.DeviceClassID
       group by a.DeviceClassName
    go
      

  2.   

    CREATE TABLE DeviceClass(DeviceClassID INT,DeviceClassName NVARCHAR(50))
    CREATE TABLE Devic(DeviceID INT,DeviceName NvarChar(50),DeviceClassID INT)
    INSERT DeviceClass SELECT 1,'aa' UNION ALL SELECT 2,'bb' UNION ALL SELECT 3,'cc'
    INSERT Devic SELECT 1,'xxx',1
    UNION ALL SELECT 2,'yyy',1
    UNION ALL SELECT 3,'yyy',1
    UNION ALL SELECT 4,'yyy',2
    DECLARE @s VARCHAR(8000)
    SELECT @s=''
    SELECT @s=@s+',['+DeviceClassName+']=MAX(CASE WHEN DeviceClassName=''' + DeviceClassName + ''' THEN CNT ELSE 0 END)'
    FROM
    (
    SELECT DeviceClassName,ISNULL(Cnt,0) CNT
    FROM DeviceClass a
    LEFT JOIN
    (SELECT DeviceClassID,COUNT(1) CNT FROM Devic GROUP BY DeviceClassID) b
    ON a.DeviceClassID=b.DeviceClassid
    ) x
    SELECT @s='SELECT ' + STUFF(@s,1,1,'') + ' FROM  (
    SELECT DeviceClassName,ISNULL(Cnt,0) CNT
    FROM DeviceClass a
    LEFT JOIN
    (SELECT DeviceClassID,COUNT(1) CNT FROM Devic GROUP BY DeviceClassID) b
    ON a.DeviceClassID=b.DeviceClassid
    ) x'
    EXEC(@s)DROP TABLE DeviceClass,Devic
      

  3.   

    就是行转列.要简化上面的语句的话,就是把那个连接查询存为临时表CREATE TABLE DeviceClass(DeviceClassID INT,DeviceClassName NVARCHAR(50))
    CREATE TABLE Devic(DeviceID INT,DeviceName NvarChar(50),DeviceClassID INT)
    INSERT DeviceClass SELECT 1,'aa' UNION ALL SELECT 2,'bb' UNION ALL SELECT 3,'cc'
    INSERT Devic SELECT 1,'xxx',1
    UNION ALL SELECT 2,'yyy',1
    UNION ALL SELECT 3,'yyy',1
    UNION ALL SELECT 4,'yyy',2
    SELECT DeviceClassName,ISNULL(Cnt,0) CNT
    INTO tmp
    FROM DeviceClass a
    LEFT JOIN
    (SELECT DeviceClassID,COUNT(1) CNT FROM Devic GROUP BY DeviceClassID) b
    ON a.DeviceClassID=b.DeviceClassidDECLARE @s VARCHAR(8000)
    SELECT @s=''
    SELECT @s=@s+',['+DeviceClassName+']=MAX(CASE WHEN DeviceClassName=''' + DeviceClassName + ''' THEN CNT ELSE 0 END)'
    FROM tmp
    SELECT @s='SELECT ' + STUFF(@s,1,1,'') + ' FROM tmp'
    EXEC(@s)DROP TABLE DeviceClass,Devic,tmp
      

  4.   

    Create proc procname
    as
     Select DeviceClass.DeviceClassName,count(DeviceID) as '设备数量'
       from DeviceClass inner join Devic 
         on DeviceClass.DeviceClassID=Devic.DeviceClassID
       group by DeviceClass.DeviceClassName
    go你测试一下阿