2017-01-19 5 views
-1

"주식"인 테이블이 있습니다. 이 테이블에는 수천 개의 레코드가 있으며이를 acc에 업데이트해야합니다. 다음 예제를 참조하십시오. 나는이 같은 표가 원하는 코드를 실행 한 후하위 쿼리를 사용하여 테이블을 업데이트하는 방법

STOCKS.stock_name  STOCKS.a_id 
A.001     0 
B.001     0 
C.001     20 
A.002     0 
B.002     10 
A.003     0 

(I는 SQL Server 2008을 사용) : 여기에 일어날 필요가 무엇

STOCKS.stock_name  STOCKS.a_id 
A.001     20 
B.001     20 
C.001     20 
A.002     10 
B.002     10 
A.003     0 

는 SQL 이해한다는 것입니다을 001-002 및 003은 3 개의 다른 그룹입니다. (SUBSTRING (stock_name, 3,20)을 사용하려고 생각하고 있습니다. 텍스트 값의 처음 두 부분이 "AA.002"이 아니기 때문에 각 주식 이름의 세 번째 부분부터 그룹화가 시작됩니다.) It 최대 a.id 값을 선택하고 그에 따라 행을 업데이트합니다. 나는이 문제에 관해 당신의 도움이 정말로 필요합니다.

미리 감사드립니다.

+0

사용중인 데이터베이스에 질문에 태그를 지정해야합니다. –

+0

안녕하세요 고든, 귀하의 의견에 많은 감사드립니다. 나는 너에게 질문을 편집했다. –

답변

0

이게 원하는가요?

update stocks s 
    set id = (select max(s2.id) from stocks s2 where substring(s2.stock_name, 3, 20) = substring(s.stockname, 3, 20) 
       ) 
    where s.id = 0; 
+0

안녕하세요 고든, 많은 의견에 감사드립니다. 그러나 그것은 작동하지 않았다. –

+0

주식 업데이트 세트 a.id = (T1 (T1.a_id)를 주식에서 선택하십시오. T1은 외부 주식을 T2의 T2로 남겨 둡니다.) .a_RECno = T2.a_RECno where substring (T1.a_id, 3, 20) = substring (T2.a_id, 3, 20)) 여기서 a_id = 0 –

+0

위의 코드를 변경 한 이유는 나는 다음과 같은 코드를 입력 할 수 있는지 확인한다 : update t set a.id = (t (max)를 선택하라. 복제 테이블을 참조해야하며 T2와 동일한 테이블에 합류 한 후에도 작동하지 않습니다. 내가 말했듯이 모든 레코드가 업데이트되었으며 해당 열의 최대 값으로 a_id가 설정되었습니다. –

0

하나의 가능성이 있습니다. 명확성을 위해 테이블 ​​변수를 사용했습니다. 하위 쿼리에이 중 일부를 적용 할 수 있습니다. 그러나 이것은 즉시 작동해야합니다. 모든 답변 및 지원에 대한 여러분 모두 감사의

-- Your example data for demonstration purposes. 
CREATE TABLE #STOCKS (stock_name nvarchar(5), a_id int) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('A.001', 0) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('B.001', 0) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('C.001', 20) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('A.002', 0) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('B.002', 10) 
INSERT INTO #STOCKS (stock_name, a_id) VALUES ('A.003', 0) 

-- To capture the stock name fragments, and the maximum value for each name fragment. 
DECLARE @StockValues TABLE (stock nvarchar(5), stockNameFrag nvarchar(5), stockValue int) 
DECLARE @StockMaxValues TABLE (stockNameFrag nvarchar(5), stockMaxValue int) 

-- Data captured in this variable gets used in the next subquery. 
INSERT INTO @StockValues (stock, stockNameFrag, stockValue) 
SELECT s.stock_name, SUBSTRING(s.stock_name, 3, 20), s.a_id 
FROM #STOCKS s 
ORDER BY s.a_id DESC 

-- Now extract the maximum value for each name fragment in @StockValues. 
INSERT INTO @StockMaxValues 
SELECT sv1.stockNameFrag, MAX(sv2.MaxValue) 
FROM @StockValues sv1 
     INNER JOIN (
      SELECT stockNameFrag, MAX(stockValue) AS MaxValue 
      FROM @StockValues 
      GROUP BY stockNameFrag 
      ) sv2 ON sv1.stockNameFrag = sv2.stockNameFrag AND sv1.stockValue = sv2.MaxValue 
GROUP BY sv1.stock, sv1.stockNameFrag 

-- Store results you want 
DECLARE @Stock TABLE (stock nvarchar(5), stockMaxValue int) 
INSERT INTO @Stock (stock, stockMaxValue) 
SELECT s.stock_name, smv.stockMaxValue 
FROM #STOCKS s 
     INNER JOIN @StockMaxValues smv ON smv.stockNameFrag = SUBSTRING(s.stock_name, 3, 20) 

-- Now update the #STOCKS table with the max value for each stock. 
UPDATE s1 
SET  s1.a_id = s2.stockMaxValue 
FROM #STOCKS s1 
     INNER JOIN @Stock s2 ON s1.stock_name = s2.stock 

SELECT * FROM #STOCKS 

-- Cleanup from the demo table. 
DROP TABLE #STOCKS 
+0

Hello Ken. 많은 의견을 보내 주셔서 감사합니다. 코드가 작동하는지 확인하기 위해 코드를 사용했습니다. 다른 생각이 내 마음에 떠오른다. 코드가 작동하지 않던가 아니면 실수를했는지 여부. 우선 코드 끝 부분에서 UPDATE를 기대하고있었습니다. 그러나 UPDATE가 없습니다. 나는 당신이 나머지를 다룰 수 있기를 원한다고 생각합니다 :) 그러나 어쨌든, 당신의 공헌은 내가 당신을 다시 한번 감사하게 만들었습니다! 아래 코드를 공유하겠습니다. –

+0

바리도 환영합니다. 맞습니다. 원래 해당 솔루션에 대한 업데이트를 적용하지 않았습니다. #STOCKS 테이블을 업데이트 할 수 있도록 지금 개정되었습니다. 테이블 변수 (@Stock)와 UPDATE 문을 추가했습니다. 감사. –

0

이것은 stock_name

UPDATE s 
SET s.a_id = (
     SELECT MAX(a_id) 
     FROM Stocks 
     WHERE SUBSTRING(stock_name, 3, 20) = SUBSTRING(s.stock_name, 3, 20) 
) 
FROM Stocks s 
WHERE SUBSTRING(s.stock_name, 3, 20) = '001' 
+0

귀하의 답변에 많은 감사드립니다. 그러나이 코드는 '001'로 끝나는 주식 이름 만 업데이트합니다. 그럼에도 불구하고 코드의 끝 부분에있는 where 조건을 제거하면 코드가 전체 s.a_id 열을 변경하고 표의 최대 값으로 설정합니다. 우리의 경우 모든 값은 최대 값이므로 20으로 바뀝니다. –

0

먼저 업데이트됩니다. 켄 파머 (Ken Palmer)의 의견을 통해이 답변을 가능하게 만들었습니다. 다음은 완벽하게 작동하는 코드입니다.

DECLARE @MAXPRIM table (StockNameFrag nvarchar(20), StockValue int) 


INSERT INTO @MAXPRIM(StockNameFrag, StockValue) 
SELECT SUBSTRING(stock_name,3,20), Max(a_id) 
FROM Stocks 
Group By SUBSTRING(stock_name,3,20) 

UPDATE STOCKS 
set a_id = (select StockValue from @MAXPRIM where StockNameFrag =SUBSTRING(stock_name,3,20)) 
0

모든 행을 업데이트하려면 아래 쿼리가 작동해야합니다.

UPDATE s 
SET s.a_id = b.max_value 
FROM Stocks s 
JOIN (
    SELECT SUBSTRING(stock_name, 3, 20) AS 'stock_name', MAX(a_id) 'max_value' 
    FROM Stocks s 
    GROUP BY SUBSTRING(s.stock_name, 3, 20) 
) b on b.stock_name = SUBSTRING(s.stock_name, 3, 20)