Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS SQL:需要从单元格中获取类似行的行值,代码无法正常工作_Sql_Sql Server - Fatal编程技术网

MS SQL:需要从单元格中获取类似行的行值,代码无法正常工作

MS SQL:需要从单元格中获取类似行的行值,代码无法正常工作,sql,sql-server,Sql,Sql Server,我有100个excel sheetsCSV文件需要用于历史加载。我将使用ETL将所有CSV加载到一个stage表中 我试图从类似行的单元格中获取行值。请查看中的快照 这里的输出快照:黑勾是正确的,红十字是错误的 前三部分我答对了,但其他部分我答错了。红色的横截面是错误的,因为我需要在行截面中获取日期 ALTER TABLE dbo.[sql GET VALUES] ADD rowId INT IDENTITY(1, 1) ALTER TABLE dbo.[sql GET VALUES] ADD

我有100个excel sheetsCSV文件需要用于历史加载。我将使用ETL将所有CSV加载到一个stage表中

我试图从类似行的单元格中获取行值。请查看中的快照

这里的输出快照:黑勾是正确的,红十字是错误的

前三部分我答对了,但其他部分我答错了。红色的横截面是错误的,因为我需要在行截面中获取日期

ALTER TABLE dbo.[sql GET VALUES] ADD rowId INT IDENTITY(1, 1)
ALTER TABLE dbo.[sql GET VALUES] ADD RequiredColumn VARCHAR(255) NULL

UPDATE a
SET requiredColumn = column1
FROM dbo.[sql GET VALUES] a
WHERE column1 LIKE '%Sunday%'
      OR column1 LIKE '%Monday%'
      OR column1 LIKE '%tuesday%'
      OR column1 LIKE '%wednesday%'
      OR column1 LIKE '%thursday%'
      OR column1 LIKE '%friday%'
      OR column1 LIKE '%saturday%'

IF OBJECT_ID('Tempdb.dbo.#temptable') IS NOT NULL
BEGIN
    DROP TABLE tempdb.dbo.#temptable
END

SELECT rowID,
       CASE
           WHEN CONVERT(VARCHAR(255), requiredcolumn) IS NOT NULL THEN
               CONVERT(VARCHAR(255), requiredcolumn)
           ELSE
       (
           SELECT MAX(requiredcolumn)
           FROM dbo.[sql GET VALUES]
           WHERE rowID <= t.rowID - 1
       )
       END AS requiredcolumn
INTO #temptable
FROM dbo.[sql GET VALUES] t

UPDATE a
SET a.requiredcolumn = i.requiredcolumn
-- select a.requiredcolumn, i.requiredcolumn,* 
FROM #temptable i
    INNER JOIN dbo.[sql GET VALUES] a
        ON i.rowID = a.rowID

SELECT *
FROM [sql GET VALUES]

我需要为每一行获取日期信息,每一行的列上都有日期值。

在这里尝试一下,注意下面代码中的一些假设

rowid从第一节第一行的1开始。 每个部分都有相同数量的行,并且是完整的。 每个部分都有顺序相同的行 如果不是上述情况,则需要更多列来标识每个节并区分其中的行。确定节中哪些行有日期或类似的日期

--DROP TABLE #c
CREATE TABLE #C (col varchar(255) ,rowid int,col1 varchar(255))
INSERT INTO #C values('Wednesday, March 06, 2019 - Weather: TY: 15‹C', 1,NULL)
INSERT INTO #C values('a', 2,NULL)
INSERT INTO #C values('b', 3,NULL)
INSERT INTO #C values('c', 4,NULL)


INSERT INTO #C values('Thursday, March 07, 2019 - Weather: TY: 12‹C', 5,NULL)
INSERT INTO #C values('a', 6,NULL)
INSERT INTO #C values('b', 7,NULL)
INSERT INTO #C values('c', 8,NULL)

INSERT INTO #C values('Friday, March 08, 2019 - Weather: TY: 12‹C', 9,NULL)
INSERT INTO #C values('a', 10,NULL)
INSERT INTO #C values('b', 11,NULL)
INSERT INTO #C values('c', 12,NULL)




WITH InterSection AS
(
    SELECT *,
    (rowid - 1) % 4 AS SectionRowId,
    ((rowid - 1) % 4) - ROW_NUMBER() OVER (ORDER BY rowid) AS SectionId
    FROM #C
)

SELECT c.*, ii.col AS NewCol1 FROM #C c
LEFT JOIN InterSection i ON c.rowid = i.rowid
LEFT JOIN InterSection ii ON ii.SectionRowId = 0 AND ii.SectionId = i.SectionId

使用CTE和双重使用MAX的窗口功能可以实现这一点

然后它可以在1个update语句中完成

在SQL中,第一个最大值使用有效的column1值计算上一个/当前的最高Id。 第二个MAX使用该计算出的id来获取有效的column1值

样本数据:

更新和选择

返回:


不要链接到dropbox。你的链接不起作用。提供示例数据和最少的运行示例。你的问题一点也不清楚。你还会发现,人们不会信任从陌生人那里下载资源的链接。将DDL和DML放在您的帖子中。@CodeMonkey我不太确定如何解释我的要求,如果我的帖子不清楚,很抱歉,请参阅附件中的屏幕截图和示例表创建脚本。@Larnu我已使用快照和示例表创建进行了编辑。该链接在匿名模式下对我有效,非常确定它应该对其他人有效。@SuccessMaharjan谢谢更新,我现在理解了。今天晚些时候我会发布一个答案。嘿@codemonkey,在不同的日期,节中的行是不同的。@SuccessMaharjan这很公平,然后我会使用LukStorms解决方案。或者你可以扩展我的,并映射每一行,就像他在他的CASE-WHEN-like模式中所做的那样。非常感谢你
--DROP TABLE #c
CREATE TABLE #C (col varchar(255) ,rowid int,col1 varchar(255))
INSERT INTO #C values('Wednesday, March 06, 2019 - Weather: TY: 15‹C', 1,NULL)
INSERT INTO #C values('a', 2,NULL)
INSERT INTO #C values('b', 3,NULL)
INSERT INTO #C values('c', 4,NULL)


INSERT INTO #C values('Thursday, March 07, 2019 - Weather: TY: 12‹C', 5,NULL)
INSERT INTO #C values('a', 6,NULL)
INSERT INTO #C values('b', 7,NULL)
INSERT INTO #C values('c', 8,NULL)

INSERT INTO #C values('Friday, March 08, 2019 - Weather: TY: 12‹C', 9,NULL)
INSERT INTO #C values('a', 10,NULL)
INSERT INTO #C values('b', 11,NULL)
INSERT INTO #C values('c', 12,NULL)




WITH InterSection AS
(
    SELECT *,
    (rowid - 1) % 4 AS SectionRowId,
    ((rowid - 1) % 4) - ROW_NUMBER() OVER (ORDER BY rowid) AS SectionId
    FROM #C
)

SELECT c.*, ii.col AS NewCol1 FROM #C c
LEFT JOIN InterSection i ON c.rowid = i.rowid
LEFT JOIN InterSection ii ON ii.SectionRowId = 0 AND ii.SectionId = i.SectionId
IF OBJECT_ID('tempdb..#C', 'U') IS NOT NULL DROP TABLE #C; 
CREATE TABLE #C (rowid int primary key identity(1,1), column1 VARCHAR(255), RequiredColumn VARCHAR(255));

insert into #C (column1) values
('Wednesday, March 06, 2019 - Weather: TY: 15‹C'),
('a'),
('b'),
('c'),
('Thursday, March 07, 2019 - Weather: TY: 12‹C'),
('d'),
('e'),
('f'),
('Friday, March 08, 2019 - Weather: TY: 12‹C'),
('g'),
('h'),
('i');
;WITH CTE AS
(
    select *, 
     max(case when rowid = MaxPrevId then column1 end) over (partition by MaxPrevId) as column1calc
    from
    (
        select rowid, column1, RequiredColumn,
        max(case 
            when column1 LIKE '%sunday%'
              OR column1 LIKE '%monday%'
              OR column1 LIKE '%tuesday%'
              OR column1 LIKE '%wednesday%'
              OR column1 LIKE '%thursday%'
              OR column1 LIKE '%friday%'
              OR column1 LIKE '%saturday%' 
            then rowid 
            end) over (order by rowid ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as MaxPrevId
        from #C
    ) q
)
UPDATE CTE 
SET RequiredColumn = column1calc;

select rowid, RequiredColumn 
from #C
order by rowid;
rowid   RequiredColumn
1       Wednesday, March 06, 2019 - Weather: TY: 15‹C
2       Wednesday, March 06, 2019 - Weather: TY: 15‹C
3       Wednesday, March 06, 2019 - Weather: TY: 15‹C
4       Wednesday, March 06, 2019 - Weather: TY: 15‹C
5       Thursday, March 07, 2019 - Weather: TY: 12‹C
6       Thursday, March 07, 2019 - Weather: TY: 12‹C
7       Thursday, March 07, 2019 - Weather: TY: 12‹C
8       Thursday, March 07, 2019 - Weather: TY: 12‹C
9       Friday, March 08, 2019 - Weather: TY: 12‹C
10      Friday, March 08, 2019 - Weather: TY: 12‹C
11      Friday, March 08, 2019 - Weather: TY: 12‹C
12      Friday, March 08, 2019 - Weather: TY: 12‹C