Я только что подошел к SQL и не имел решения сделать это. У меня есть 2 таблицы A и B:

A                B 
ID (char)        Year (char)
Zone (char)      Code (char)
ZCode (char)     

Сначала таблица B будет полностью пустой. Ex данные таблицы A:

A                
01  A  2013/AA   
02  A  2018/KK
03  A  null
04  B  
05  B  2016/HH

Я хочу обновить данные из таблицы A в таблицу B при условии, что только ZCode of Zone имеет последний год, а ZCode будет разделен знаком "/". Это результат, который я хочу:

B
2018  KK
2016  HH

С нетерпением жду, чтобы кто-нибудь дал мне решение сделать это.

1
Triet Pham 27 Фев 2018 в 13:44

5 ответов

Лучший ответ

Очень простое решение, если ваши данные согласованы. Это работает, только если ваши данные всегда имеют полный год как число, например: 2018 слева и только 2 символа справа. Это более сложное кодирование длины столбца, поэтому я не вижу причины, по которой вы не можете его использовать. Использование Max выберет последний год по коду

Insert into tableB (Year,Code)
select Max(Left(Columnname,4)) year, 
       Right (columnname,2) Code  from TableA
       where Right (columnname,2) is not null or Right (columnname,2)<> ''
       group by Right (columnname,2)
1
Ven 27 Фев 2018 в 11:20

Попробуй это

IF OBJECT_ID('dbo.TableA')IS NOT NULL
  DROP TABLE TableA
IF OBJECT_ID('dbo.TableB')IS NOT NULL
  DROP TABLE TableB
CREATE TABLE TableA (Id INT,Zone VARCHAR(2) ,ZCode VARCHAR(20))
CREATE TABLE TableB ([Year] INT,Code VARCHAR(20))   
GO

INSERT INTO TableA(Id,Zone,ZCode)
SELECT 01,'A','2013/AA' UNION ALL   
SELECT 02,'B','2016/HH' UNION ALL
SELECT 03,'A','2018/KK' 
GO


INSERT INTO TableB

SELECT   [Year]
        ,[Code] 
FROM
(
    SELECT   SUBSTRING(ZCode,0,CHARINDEX('/',ZCode)) As [Year]
            ,SUBSTRING(ZCode,CHARINDEX('/',ZCode)+1,LEN(ZCode)) AS Code 
    FROM TableA
)dt


SELECT * FROM TableB  ORDER BY [Year] DESC

Результат

Year    Code
------------
2018    KK
2016    HH
2013    AA
1
Sreenu131 27 Фев 2018 в 11:08

Вы можете использовать этот запрос для вставки данных в таблицу B, когда она полностью пуста

INSERT INTO B ([YEAR], [MONTH])
select
Substring(ZCode,0,charindex('/',ZCode)) BYEAR,
Substring(ZCode,charindex('/',ZCode)+1,LEN(ZCode)-charindex('/',ZCode)) BCode
from A

Иначе использование может обновить этот запрос, чтобы обновить запись таблицы B на основе BCode.

Запрос отредактирован для условий NOT NULL и GROUP

select MAX(v.BYEAR), v.BCode from
(select
 Substring(ZCode,0,charindex('/',ZCode)) BYEAR
,Substring(ZCode,charindex('/',ZCode)+1,LEN(ZCode)-charindex('/',ZCode)) BCode
from B ) v
Where v.BCODE IS NOT NULL 
Group by v.BCODE
1
Krupa 27 Фев 2018 в 11:32

Приведенный ниже фрагмент кода даст желаемый результат, теперь, основываясь на ваших требованиях, вы можете либо сделать INSERT в tableB, либо сделать UPDATE

DECLARE @A TABLE(ID CHAR(10), ZONE CHAR(10), ZCODE CHAR(20))
INSERT INTO @A VALUES
('01',  'A',  '2013/AA'),   
('02',  'B',  '2016/HH'),
('03',  'A',  '2018/KK')

SELECT Year,Code FROM(
SELECT Year,Code,ROW_NUMBER() OVER (PARTITION BY ZONE ORDER BY Year DESC) rn FROM
(SELECT cast(concat('<x>', REPLACE(ZCODE, '/', '</x><x>'), '</x>') as xml).value('/x[1]','varchar(100)') AS Year,
       cast(concat('<x>', REPLACE(ZCODE, '/', '</x><x>'), '</x>') as xml).value('/x[2]','varchar(100)') AS Code,*
FROM @A WHERE ZCODE IS NOT NULL) t1) t2
WHERE rn = 1;
1
Abhishek 27 Фев 2018 в 11:15

Для того, чтобы UPDATE в таблице B вам необходимо JOIN создать таблицу с таблицей B в столбцах Year / Code

WITH CTE AS
(
     SELECT 
          left(a.zcode, 4) year, 
          substring(a.zcode, charindex('/', a.zcode)+1, len(a.zcode)) code  
     FROM tableA a
     INNER JOIN (
              select Zone, max(left(zcode, 4)) year 
              FROM tableA
              GROUP BY Zone
      )b ON a.Zone = b.zone and b.year = left(a.zcode, 4)
)
SELECT * FROM CTE
1
Yogesh Sharma 27 Фев 2018 в 11:10