2013-07-17 44 views
-1

我知道,这是不好的礼仪张贴在其他论坛上同样的问题链接,但这里是我的问题链接:动态透视SQL Server中的多个列2000

http://www.sqlservercentral.com/Forums/Topic1474579-8-1.aspx

的Microsoft SQL Server 2000 - 8.00.2039(Intel X86)2005年5月3日23:18:38 Copyright(c)1988-2003 Windows NT 5.2(内部版本3790:Service Pack 2)上的Microsoft Corporation企业版

表结构和样本插入语句:

create table consumption (
code varchar(6), 
prodname varchar(50), 
department varchar(20), 
netqty decimal(10,2), 
netmrp decimal(10,2) 
) 

insert into consumption values ('U00180','USG JELLY IM-K','SONO',11.4,130.40) 
insert into consumption values ('U00280','UNIDINE 1 LITRE SOLUTION','AKD',1.4,10.40) 
insert into consumption values ('V02401','VOLINI GEL 50GM','PHYSIOTHERAPY',8,15) 
insert into consumption values ('V02402','X RAY FILM DIGITAL 14"X 17"','MRI',3,26.40) 
insert into consumption values ('U00380','TROPAC P DROPS ','AKD',21.46,56.78) 
insert into consumption values ('U00380','TROPAC P DROPS ','AKD',10,10) 

表数据:

code prodname   department netqty  netmrp 
U00180 USG JELLY IM-K   SONO  11.40  130.40 
U00280 UNIDINE 1 LITRE SOLUTION AKD  1.40  10.40 
V02401 VOLINI GEL 50GM   PHYSIOTHERAPY 8.00  15.00 
V02402 X RAY FILM DIGITAL 14"X 17" MRI  3.00  26.40 
U00380 TROPAC P DROPS   AKD  21.46  56.78 
U00380 TROPAC P DROPS   AKD  10.00  10.00 

所需的输出请:

CODE PRODNAME        AKD     MRI    PHYSIOTHERAPY   SONO 
             NET QTY NET MRP NET QTY  NET MRP NET QTY NET MRP NET QTY NET MRP 
U00180 USG JELLY IM-K                    11.40  130.40 
U00280 UNIDINE 1 LITRE SOLUTION   1.40  10.40 
U00380 TROPAC P DROPS     31.46  66.78 
V02401 VOLINI GEL 50GM                8.00  15.00 
V02402 X RAY FILM DIGITAL 14"X 17"       3.00  26.40 

对不起,张贴问题,以这样的方式,但如果任何人都可以请通过查看上面的链接帮助我,我会感谢你的帮助。

仅仅因为我认为在那个论坛上,活动少了,所以我在这里尝试。

更新:问题已解决,我在上述链接中发布了解决方案。感谢所有参与和帮助我的人。

回答

1

其痛在SQL2000转动,但这里是我创建使用游标

DECLARE @SQL nvarchar(4000) 
DECLARE @TaskName nvarchar(100) 

SET NOCOUNT ON 

CREATE TABLE #tblTLine (
    [DT] varchar(200) 
) 

CREATE TABLE #tblTasks (
    [Tasks] varchar(200) 
) 

INSERT INTO #tblTasks (
    [Tasks] 
) 
select DISTINCT 
    Name 
from #Pivot 


INSERT INTO #tblTLine (
    [DT] 
) 
select DISTINCT 
    [DT] 
from #Pivot 
ORDER BY DT 
--WHERE Active = 1 

-- Build Table 
DECLARE cur CURSOR FOR 

select DISTINCT 
    [Tasks] 
from #tblTasks 

OPEN cur 

FETCH NEXT FROM cur INTO @TaskName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @SQL = 'ALTER TABLE #tblTLine ADD [' + @TaskName + '] nchar(1) NULL' 
    EXEC (@SQL) 

    SET @SQL = '' 

    SET @SQL = 'UPDATE #tblTLine SET [' + @TaskName + '] = ''0''' 
    EXEC (@SQL) 

    FETCH NEXT FROM cur INTO @TaskName 

END 

CLOSE cur 
DEALLOCATE cur 

-- Update Table 

DECLARE @SQLUpdate nvarchar(4000) 
DECLARE @Time nvarchar(100) 
DECLARE @Name nvarchar(100) 
DECLARE @Active nchar(1) 


DECLARE curUpdate CURSOR FOR 

SELECT 
    [DT], 
    [Name], 
    [Active] 
FROM #Pivot 
WHERE Active = 1 

OPEN curUpdate 

FETCH NEXT FROM curUpdate INTO @Time, @Name, @Active 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @SQLUpdate = 'UPDATE #tblTLine SET [' + @Name + '] = ''1'' WHERE [DT] = ''' + @Time + '''' 
    EXEC (@SQLUpdate) 

    FETCH NEXT FROM curUpdate INTO @Time, @Name, @Active 

END 

CLOSE curUpdate 
DEALLOCATE curUpdate 


SET NOCOUNT OFF 
+0

消息208,级别16,状态0,行15 无效的对象名'#Pivot'。 –

+0

你不能复制和粘贴。这是一个你可以适应自己的例子。 #Piviot是我自己创建的临时表。基本上,转换数据的部分是代码的最后部分。 –

0

首先没有看到SQL 2000枢多列,因为我正忙着解决问题的一些示例代码。

create table consumption (
code varchar(6), 
prodname varchar(50), 
department varchar(20), 
netqty decimal(10,2), 
netmrp decimal(10,2) 
) 
; 
insert into consumption values ('U00180','USG JELLY IM-K','SONO',11.4,130.40) 
insert into consumption values ('U00280','UNIDINE 1 LITRE SOLUTION','AKD',1.4,10.40) 
insert into consumption values ('V02401','VOLINI GEL 50GM','PHYSIOTHERAPY',8,15) 
insert into consumption values ('V02402','X RAY FILM DIGITAL 14"X 17"','MRI',3,26.40) 
insert into consumption values ('U00380','TROPAC P DROPS ','AKD',21.46,56.78) 
insert into consumption values ('U00380','TROPAC P DROPS ','AKD',10,10) 
; 

DECLARE @cols1 AS NVARCHAR(MAX), 
    @query1 AS NVARCHAR(MAX), 
    @query2 AS NVARCHAR(MAX); 

SET @cols1 = STUFF((SELECT distinct ',' + QUOTENAME(c.department) 
      FROM consumption c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 



set @query1 = 'select t.code,t.prodname, 
       t.AKD as netqtyAKD,t1.AKD as netmrpAKD, 
       t.MRI as netqtyMRI,t1.MRI as netmrpMRI, 
       t.PHYSIOTHERAPY as netqtyPHYSIOTHERAPY,t1.PHYSIOTHERAPY as netmrpPHYSIOTHERAPY, 
       t.SONO as netqtySONO,t1.SONO as netmrpSONO 
       from (
      SELECT code,prodname, ' + @cols1 + ' from 
      (
       select code 
        , prodname 
        , department 
        , sum(netqty) as netqty 
       from consumption 
       group by code 
        , department 
        , prodname 
      ) x 
      pivot 
      (
       sum(netqty) 
       for department in (' + @cols1 + ') 
      ) p 
      )t 
      inner join 
      (SELECT code,prodname, ' + @cols1 + ' from 
      (
       select code 
        , prodname 
        , department 
        , sum(netmrp) as netmrp 
       from consumption 
       group by code 
        , department 
        , prodname 
      ) x 
      pivot 
      (
       sum(netmrp) 
       for department in (' + @cols1 + ') 
      ) p 
      )t1 
      on t.code=t1.code 
      and t.prodname=t1.prodname' 
+0

不错的答案,虽然:) .. pivotiot功能是如此得心应手 –

+0

亲爱的downvoter,请帮助我了解如何张贴他/她的答案。 – Luv

+0

谢谢你的回答。在我的表格数据中,部门是动态的,所以我不能像t.AKD那样将部门硬编码为...... t.MRI ......我可以在http://的帮助下动态地转动一列www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables链接,但我需要再添加一列,在这里我正在拍摄。请告诉我你的代码与输出的行动请。 –