我试图在表中的列下依次填充另一个表中的行。这意味着,必须将特定行中的每个数据背靠背地添加到另一个表中的该列中,然后应该像下面这样添加下一行。
我尝试了所有的方法,到处搜索,但显然有一个人曾经需要这样做过。
首先,我尝试用透视将这些行转换为列,然后尝试导入,但再次失败。有什么合适的方法吗?
我只知道这件事不会用简单的
insert into tablename (columnname)
select *....我猜怎么回事?
这是我需要从中获取值的数据表的示例。每一行中的每个单元格必须背靠背;
Defter No Mezarlık Sayfa No Satır No
--------------------------------------------
20-8 ÇAMLICA 1 1
20-8 ÇAMLICA 1 2 然后将其插入本表"Value“列下;
TipId EvrakId IndexId Value KayitTarihi
--------------------------------------------
1 23 66 JohnMc NULL
2 45 32 NewYork NULL每一列都是nvarchar,Value列也是。所以我希望这张桌子是这样的;
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 .. 这是我的第一个表的完整结构,其中包括数据。
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]这是我需要填充的第二个表。
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;
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 5IndexId结构应该是这样的;
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数据.
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谢谢你的帮助。
发布于 2017-09-20 12:10:05
在这个解决方案中,我添加了表变量@tColIndexID,它保存(当前)四个新值的给定索引I。这些索引to被添加到每个新行:
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)结果:
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发布于 2017-09-14 11:29:10
这里有一个以臭名昭著的不枢轴为特征的例子:-P。正如你所建议的,我暂时取消了所有其他专栏.
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)结果:
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发布于 2017-09-20 11:57:38
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列再次编辑。另外,这两个示例列在这里不存在,因为它们不是真实的数据。
https://stackoverflow.com/questions/46216709
复制相似问题