2013-07-17 1 views
-1

Я знаю, что это плохо этикета, чтобы отправлять один и тот же вопрос ссылке на другом форуме, но тут мой вопрос ссылка:Динамическая Осевая для нескольких столбцов в SQL Server 2000

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

Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) 3 мая 2005 г. 23:18:38 Авторское право (c) 1988-2003 Microsoft Corporation Enterprise Edition в Windows NT 5.2 (сборка 3790: с пакетом обновления 2)

Операции с таблицей и примерами вставки:

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

Msg 208, Level 16, State 0, линия 15 Неверное имя объекта '#Pivot'. –

+0

yoou can not просто скопируйте и вставьте. Это пример, который вы можете приспособить для себя. #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

приятный ответ, хотя :) .. особенность пивиота настолько удобна –

+0

Уважаемый спутник, пожалуйста, помогите мне разобраться, как следует публиковать свой ответ. – Luv

+0

Благодарим вас за ответ. В моих табличных данных деления динамичны, поэтому я не могу жестко закодировать департаменты вроде t.AKD как ... t.MRI as ... Я могу динамически разворачивать один столбец с помощью http: // Ссылка www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables, но мне нужно добавить еще одну колонку, и здесь я застреваю. Пожалуйста, покажите мне свой код в действии с выходом. –