我试图在一个表中的列下填充,并逐行从另一个表开始。这意味着必须将特定行中的每个数据重新添加到另一个表中的该列中,然后应该像这样添加下一行等。
我尝试了每一种方式,到处搜索,但显然有一个人以前需要这样做。
首先,我尝试将这些行转换为带有pivot的列,然后尝试导入但又失败了。有没有正确的方法来做到这一点?
我所知道的是,这不会用简单的
完成insert into tablename (columnname)
select *....
我猜的方式?
这是我需要从中获取值的数据表的示例。每行中的每个单元格必须背靠背;
Defter No Mezarlık Sayfa No Satır No
--------------------------------------------
20-8 ÇAMLICA 1 1
20-8 ÇAMLICA 1 2
然后插入"值"此表中的列;
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 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
这两个表都有相同的" EvrakId"列应该就像它的主键一样。
表1中已有数据;
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
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
IndexId的第一个真实的20个数据......
{{1}}
感谢您的帮助。
答案 0 :(得分:1)
这是一个以臭名昭着的univot为特色的例子:-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
答案 1 :(得分:0)
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列。此外,这两个示例列不存在,因为它们不是真实数据。
答案 2 :(得分:0)
在这个解决方案中,我添加了表变量@tColIndexID,它保存(当前)四个新值的给定IndexID。然后将这些IndexID添加到每个新行:
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