首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Server 2008中另一个表中的行填充列

使用Server 2008中另一个表中的行填充列
EN

Stack Overflow用户
提问于 2017-09-14 10:30:21
回答 3查看 131关注 0票数 0

我试图在表中的列下依次填充另一个表中的行。这意味着,必须将特定行中的每个数据背靠背地添加到另一个表中的该列中,然后应该像下面这样添加下一行。

我尝试了所有的方法,到处搜索,但显然有一个人曾经需要这样做过。

首先,我尝试用透视将这些行转换为列,然后尝试导入,但再次失败。有什么合适的方法吗?

我只知道这件事不会用简单的

代码语言:javascript
复制
insert into tablename (columnname) 
    select *....

我猜怎么回事?

这是我需要从中获取值的数据表的示例。每一行中的每个单元格必须背靠背;

代码语言:javascript
复制
Defter No   Mezarlık    Sayfa No    Satır No    
--------------------------------------------
20-8        ÇAMLICA            1    1       
20-8        ÇAMLICA            1    2   

然后将其插入本表"Value“列下;

代码语言:javascript
复制
TipId   EvrakId IndexId Value   KayitTarihi
--------------------------------------------
1         23      66     JohnMc   NULL
2         45      32     NewYork  NULL

每一列都是nvarcharValue列也是。所以我希望这张桌子是这样的;

代码语言:javascript
复制
TipId   EvrakId IndexId Value   KayitTarihi
--------------------------------------------
1         23      66     JohnMc   NULL
2         45      32     NewYork  NULL
..        ..     ..      20-8     ..
..        ..     ..      ÇAMLICA  ..    
..        ..     ..      1        .. 
..        ..     ..      1        .. 
..        ..     ..      20-8     ..
..        ..     ..      ÇAMLICA  ..    
..        ..     ..      1        .. 
..        ..     ..      2        .. 

这是我的第一个表的完整结构,其中包括数据。

代码语言:javascript
复制
CREATE TABLE [dbo].[EvrakUstBilgileri](
[Evrak Id] [float] NULL,
[Defter No] [nvarchar](255) NULL,
[Mezarlık] [nvarchar](255) NULL,
[Sayfa No] [nvarchar](255) NULL,
[Satır No] [nvarchar](255) NULL,
[Ada No] [nvarchar](255) NULL,
[Mezar No] [nvarchar](255) NULL,
[Adı Soyadı] [nvarchar](255) NULL,
[Doğduğu Gün] [nvarchar](255) NULL,
[Yaş] [nvarchar](255) NULL,
[Cinsiyet] [nvarchar](255) NULL,
[Öldüğü Gün] [nvarchar](255) NULL,
[Gömüldüğü Gün] [nvarchar](255) NULL,
[Defin Ruhsatiye No] [nvarchar](255) NULL,
[Defin Ruhsatiye Tarihi] [nvarchar](255) NULL,
[Defin Ruhsatiye Verildiği Yer] [nvarchar](255) NULL,
[Eşleştirme Yapıldı] [nvarchar](255) NULL,
[Evrak Barkodu] [nvarchar](255) NULL,
[Okunamadı] [nvarchar](255) NULL,
[Not] [nvarchar](255) NULL,
[Belge Tarihi] [nvarchar](255) NULL
) ON [PRIMARY]

这是我需要填充的第二个表。

代码语言:javascript
复制
CREATE TABLE [dbo].[TblEvrakTipValue](
[TipId] [int] NOT NULL,
[EvrakId] [int] NOT NULL,
[IndexId] [int] NOT NULL,
[Value] [nvarchar](250) NULL,
[KayitTarihi] [datetime] NULL
) ON [PRIMARY]

这两个表都有相同的"EvrakId“列,该列的作用应该像主键一样。

这是已经有数据的表1;

代码语言:javascript
复制
EvrakId DefterNo    Mezarlik    SayfaNo SatirNo
5018352 20-8        ÇAMLICA     1       1
5018353 20-8        ÇAMLICA     1       2
5018354 20-8        ÇAMLICA     1       3
5018355 20-8        ÇAMLICA     1       4
5018356 20-8        ÇAMLICA     1       5

IndexId结构应该是这样的;

代码语言:javascript
复制
TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      67      20-8        NULL
NULL    23      68      ÇAMLICA     NULL
NULL    23      69      1           NULL
NULL    23      70      1           NULL
2       45      66      NewYork     NULL
NULL    45      67      20-8        NULL
NULL    45      68      ÇAMLICA     NULL
NULL    45      69      1           NULL
NULL    45      70      2           NULL
3       46      66      NewYork     NULL
NULL    46      67      20-8        NULL
NULL    46      68      NULL TEST   NULL
NULL    46      69      NULL        NULL
NULL    46      70      NULL        NULL

第一个真实的20个IndexId数据.

代码语言:javascript
复制
TipId   EvrakId IndexId Value   KayitTarihi
14         1    388      NULL   NULL
14         2    336      NULL   NULL
14         3    408      NULL   NULL
14         4    83       NULL   NULL
14         5    402      NULL   NULL
14         6    403      NULL   NULL
14         7    404      NULL   NULL
14         8    228      NULL   NULL
14         9    390      NULL   NULL
14         10   419      NULL   NULL
14         11   406      NULL   NULL
14         12   392      NULL   NULL
14         13   389      NULL   NULL
14         14   401      NULL   NULL
14         15   362      NULL   NULL
14         16   407      NULL   NULL
14         17   391      NULL   NULL
14         18   400      NULL   NULL
14         19   242      NULL   NULL
14         20   92       NULL   NULL

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-20 12:10:05

在这个解决方案中,我添加了表变量@tColIndexID,它保存(当前)四个新值的给定索引I。这些索引to被添加到每个新行:

代码语言:javascript
复制
DECLARE @t1 TABLE(
  EvrakID NVARCHAR(100),
  DefterNo NVARCHAR(100),
  Mezarlik NVARCHAR(100),
  SayfaNo NVARCHAR(100),
  SatirNo NVARCHAR(100)
)

INSERT INTO @t1 VALUES
('23', '20-8'        ,'ÇAMLICA',            '1'    ,'1')       
,('45', '20-8'        ,'ÇAMLICA',            '1'    ,'2')  
,('46', '20-8'        ,'NULL TEST',            NULL    ,NULL)  


DECLARE @t2 TABLE(
  TipID NVARCHAR(100),
  EvrakID NVARCHAR(100),
  IndexID NVARCHAR(100),
  Value NVARCHAR(100),
  KayitTarihi NVARCHAR(100)
)

INSERT INTO @t2 VALUES
('1'         ,'23'      ,'66'    ,'JohnMc',   NULL)
,('2'         ,'45'      ,'32'    ,'NewYork',  NULL)
,('3'         ,'46'      ,'32'    ,'NewYork',  NULL)

DECLARE @tColIndexID TABLE(
  ColID INT
 ,IndexID INT
)

INSERT INTO @tColIndexID
  VALUES (1, 388)
        ,(2, 336)
        ,(3, 408)
        ,(4, 83);

WITH cte AS(
  SELECT  t1.EvrakID,
          ISNULL(t1.DefterNo,'*NULL#') DefterNo,
          ISNULL(t1.Mezarlik,'*NULL#') Mezarlik,
          ISNULL(t1.SayfaNo,'*NULL#') SayfaNo,
          ISNULL(t1.SatirNo, '*NULL#') SatirNo
    FROM @t1 t1
),
cteColsToRows AS(
  SELECT EvrakID, ROW_NUMBER() OVER (PARTITION BY EvrakID ORDER BY (SELECT 0)) rn, NewRow
    FROM
    (SELECT   EvrakID,
              DefterNo,
              Mezarlik,
              SayfaNo,
              SatirNo
       FROM cte) AS nr
       UNPIVOT
       (NewRow FOR OldCols IN (DefterNo, Mezarlik, SayfaNo, SatirNo)
       ) AS NewRows
)
INSERT INTO @t2
SELECT  NULL TipID,
        EvrakID,
        t3.IndexID AS IndexId,
        CASE WHEN NewRow = '*NULL#' THEN NULL ELSE NewRow END AS Value,
        NULL KayitTarihi
  FROM cteColsToRows
  JOIN @tColIndexID t3 ON t3.ColID = rn

SELECT *
  FROM @t2
  ORDER BY EvrakID, ISNULL(TipID, 999999)

结果:

代码语言:javascript
复制
TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      388     20-8        NULL
NULL    23      336     ÇAMLICA     NULL
NULL    23      408     1           NULL
NULL    23      83      1           NULL
2       45      32      NewYork     NULL
NULL    45      388     20-8        NULL
NULL    45      336     ÇAMLICA     NULL
NULL    45      408     1           NULL
NULL    45      83      2           NULL
3       46      32      NewYork     NULL
NULL    46      388     20-8        NULL
NULL    46      336     NULL TEST   NULL
NULL    46      408     NULL        NULL
NULL    46      83      NULL        NULL
票数 0
EN

Stack Overflow用户

发布于 2017-09-14 11:29:10

这里有一个以臭名昭著的不枢轴为特征的例子:-P。正如你所建议的,我暂时取消了所有其他专栏.

代码语言:javascript
复制
DECLARE @t1 TABLE(
  EvrakID NVARCHAR(100),
  DefterNo NVARCHAR(100),
  Mezarlik NVARCHAR(100),
  SayfaNo NVARCHAR(100),
  SatirNo NVARCHAR(100)
)

INSERT INTO @t1 VALUES
('23', '20-8'        ,'ÇAMLICA',            '1'    ,'1')       
,('45', '20-8'        ,'ÇAMLICA',            '1'    ,'2')  
,('46', '20-8'        ,'NULL TEST',            NULL    ,NULL)  


DECLARE @t2 TABLE(
  TipID NVARCHAR(100),
  EvrakID NVARCHAR(100),
  IndexID NVARCHAR(100),
  Value NVARCHAR(100),
  KayitTarihi NVARCHAR(100)
)

INSERT INTO @t2 VALUES
('1'         ,'23'      ,'66'    ,'JohnMc',   NULL)
,('2'         ,'45'      ,'32'    ,'NewYork',  NULL)
,('3'         ,'46'      ,'32'    ,'NewYork',  NULL)

DECLARE @MaxIndexID INT = (SELECT MAX(IndexId) FROM @t2);

WITH cte AS(
  SELECT  t1.EvrakID,
          ISNULL(t1.DefterNo,'*NULL#') DefterNo,
          ISNULL(t1.Mezarlik,'*NULL#') Mezarlik,
          ISNULL(t1.SayfaNo,'*NULL#') SayfaNo,
          ISNULL(t1.SatirNo, '*NULL#') SatirNo
    FROM @t1 t1
),
cteColsToRows AS(
  SELECT EvrakID, ROW_NUMBER() OVER (PARTITION BY EvrakID ORDER BY (SELECT 0)) rn, NewRow
    FROM
    (SELECT   EvrakID,
              DefterNo,
              Mezarlik,
              SayfaNo,
              SatirNo
       FROM cte) AS nr
       UNPIVOT
       (NewRow FOR OldCols IN (DefterNo, Mezarlik, SayfaNo, SatirNo)
       ) AS NewRows
)
INSERT INTO @t2
SELECT  NULL TipID,
        EvrakID,
        @MaxIndexID + rn AS IndexId,
        CASE WHEN NewRow = '*NULL#' THEN NULL ELSE NewRow END AS Value,
        NULL KayitTarihi
  FROM cteColsToRows

SELECT *
  FROM @t2
  ORDER BY EvrakID, ISNULL(TipID, 999999)

结果:

代码语言:javascript
复制
TipID   EvrakID IndexID Value       KayitTarihi
1       23      66      JohnMc      NULL
NULL    23      67      20-8        NULL
NULL    23      68      ÇAMLICA     NULL
NULL    23      69      1           NULL
NULL    23      70      1           NULL
2       45      32      NewYork     NULL
NULL    45      67      20-8        NULL
NULL    45      68      ÇAMLICA     NULL
NULL    45      69      1           NULL
NULL    45      70      2           NULL
3       46      32      NewYork     NULL
NULL    46      67      20-8        NULL
NULL    46      68      NULL TEST   NULL
NULL    46      69      NULL        NULL
NULL    46      70      NULL        NULL
票数 1
EN

Stack Overflow用户

发布于 2017-09-20 11:57:38

代码语言:javascript
复制
TipId   EvrakId IndexId Value   KayitTarihi
NULL    1811417 388     41-2    NULL
NULL    1811417 336     NULL    NULL
NULL    1811417 408     9       NULL
NULL    1811417 83      11      NULL
NULL    1811425 388     41-2    NULL
NULL    1811425 336     NULL    NULL
NULL    1811425 408     9       NULL
NULL    1811425 83      12      NULL
NULL    1811446 388     41-2    NULL
NULL    1811446 336     NULL    NULL
NULL    1811446 408     11      NULL
NULL    1811446 83      1       NULL

这应该是表2的最终状态。正如您可以看到的,一些预定义的、已知的IndexId值只是对每一个新的EvrakId重复它们自己。当然,这个示例只适用于4列。我的第一个表中有20列,因此有20种不同的IndexId,但是一旦您给我正确的算法(查询),我将能够像以前一样为所有20列再次编辑。另外,这两个示例列在这里不存在,因为它们不是真实的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46216709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档