2013-07-17 45 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鏈接,但我需要再添加一列,在這裏我正在拍攝。請告訴我你的代碼與輸出的行動請。 –