【问题标题】:SQL 2000 query troubleSQL 2000 查询麻烦
【发布时间】:2010-11-15 17:02:47
【问题描述】:

考虑下表

create table sample(id, name, numeric, qno, ans1,ans2,ans3)

sample data

1, 'vivek', 1, 'a', 'b', ''
2, 'vivek', 1, 'c', 'd', ''
3, 'vivek', 2, 'e', 'f', 'g'
4, 'vivek', 3, 'h', 'i', 'j'
5, 'vijay', 1, 'k', '', 'l'
6, 'vijay', 2, 'm', '', 'n'
7, 'vijay', 2, 'o', '', 'p'
8, 'vikram', 3, 'q', 'r', 's'


output expected

column Names: name, info1, info2, info3

    values
'vivek','ab','ef','hij'
'vivek','cd','',''
'vijay','kl', 'mn',''
'vijay','','op',''
'vikram','','','qrs'

将行转换为列。

换句话说。一个答案将有一排。一个问题可以有多个答案。

输出应该有答案数字作为列。

sql 2000有什么快速简单的技巧吗?

【问题讨论】:

  • 标准是什么?例如,为什么 abc,abc 错过了?
  • 抱歉给您带来了困惑。我编辑了这个问题。
  • @Vivek - 问题和预期的答案仍然没有明确的意义。您能否正确查看您的问题并进行编辑。
  • 表的结构和值是正确的。要求是生成一个以答案为列的 csv 文件。但在表格中,每个问题都会有一行。输出中的行数将等于问题的最大答案数。例如:如果 qno1 有 10 个答案,则 qno2 有 2 个,而 qno 3 有 8 个答案。输出中的总行数将为 10。
  • 表格示例中的列数(7 列)与您的示例数据(6 列)不匹配。除此之外,很难推断出预期输出背后的逻辑——请描述你想要实现的目标。

标签: sql sql-server tsql sql-server-2000 pivot


【解决方案1】:

首先,如果我理解您的问题,那么我认为您的第一个结果应该是 'vivek','ab','efg','hij' 而不是 'vivek','ab','ef','hij'

如果是这样,那么我认为以下 可能 做你想做的事。

IF OBJECT_ID('TempDB..#TempSample') IS NOT NULL
    DROP TABLE #TempSample

DECLARE @PrevName  nvarchar(80),
@PrevRow_number     INT,
@PrevQno int 


select
    isNull(id, 0)   as id , 
    isNull(sname, '')   as sName , 
    IsNull(qno,0)       as qno ,
    ans1, 
    ans2, 
    ans3  , 
    CAST(0 AS INT) AS row_number ,
    Cast('' as Nvarchar(80)) as newAns1, 
    Cast('' as Nvarchar(80)) as newAns2, 
    Cast('' as Nvarchar(80)) as newAns3
    INTO #TempSample
    from 
    (select id, sname, qno, ans1, ans2, ans3 from sample ) t3


ALTER TABLE #TempSample ADD PRIMARY KEY CLUSTERED (sName, qno , id)

UPDATE #TempSample 
    SET @PrevRow_number = row_number = CASE WHEN   sName = @PrevName and qno = @PrevQno THEN @PrevRow_number +1 ELSE 1 END,
        @PrevName  = sname ,
        @PrevQno   = qno,
        newAns1                        = case when sName = @PrevName and qno=1 Then newAns1 + ans1+ans2+ans3 else newAns1 end ,
        newAns2                        = case when sName = @PrevName and qno=2 Then newAns2 + ans1+ans2+ans3 else newAns2 end ,
        newAns3                        = case when sName = @PrevName and qno=3 Then newAns3 + ans1+ans2+ans3 else newAns3 end 
FROM #TempSample  WITH(TABLOCKX)
OPTION (MAXDOP 1)


Select sName,  Max(newAns1) as Ans1 , Max(newAns2) as Ans2, Max(newAns3) as Ans3 
From #TempSample 
Group by sName, Row_Number
Order By sName  

最近在Sql 2000上遇到了类似的问题,所以信用必须到SqlServerCentral上的this article

【讨论】:

    【解决方案2】:

    不,没有简单的方法可以在 sql 2000 中创建数据透视表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2015-05-10
      相关资源
      最近更新 更多