2017-12-14 6 views
0

날짜가이 포함 된 SQL 테이블의 날짜 열을 변경해야합니다. 20170101 ~ 20170102. 그러나 새로운 날짜 20170102이 이미 존재할 수 있습니다. 날짜 열이 고유 색인의 일부이므로 중복 키 오류가 발생합니다.중복 키 삽입 : 함께 값 추가

내 첫번째 생각은 중복 키를 삽입을 사용하는 것이었다 :

INSERT INTO table (Date, Amount) 
SELECT '20170102', Amount 
FROM table 
WHERE Date = '20170101' 
ON DUPLICATE KEY UPDATE Amount = OldAmount + NewAmount 

부분 Amount = OldAmount + NewAmount 분명히 작동하지 않을 수 있습니다. 하지만 어떻게하면 내 문제를 해결할 수 있습니까?

+0

mysql 및 tsql 태그는 일반적으로 호환되지 않습니다. 해당 소프트웨어 (MySQL, Oracle, DB2 등) 및 버전으로 질문에 태그를 답니다. 'sql-server-2014'. 구문과 기능의 차이가 종종 답변에 영향을 미칩니다. 'tsql'은 선택 항목을 좁히지 만 데이터베이스는 지정하지 않습니다. – HABO

+0

[this] (https://stackoverflow.com/questions/1197733/does-sql-server-offer-anything-like-mysqls-on-duplicate-key-update) 질문 도움이 되셨습니까? – HABO

+0

병합 명령을 사용하면 거기에 도착합니다. – Paparazzi

답변

0

다음은 사용자의 대답입니다. 이전 표 TABLE1 (DATE1 DATE PRIMARY KEY, AMOUNT INT);

  1. DATE로 새 열 DATE2를 추가

    ALTER TABLE TABLE1이 COLUMN DATE2의 날짜를 추가;

  2. DATE2를 모두 이전 날짜로 생성하십시오.

    UPDATE TABLE1 세트 DATE2 = DATE1; - OLD 열 DATE1 또는 날짜는 DATE를 업데이트 할 기록

  3. UPDATE DATE2

    UPDATE TABLE1 SET DATE2 = '20170101'어디 DATE1 = '20170102'; - 20,170,101이 이미

  4. 첨가 양의 기록을 얻기 존재한다고 가정

    SELECT DATE2 TABLE1 그룹 1에 의하여, SUM (AMOUNT); -이

  5. 당신은 레코드 새 테이블 TABLE2를 만들고 삽입 할 수 있습니다 합계와 모든 레코드를 표시합니다 :

    CREATE TABLE TABLE2 (DATE1 날짜 기본 키, 금액의 int)를; INSERT INTO TABLE2 SELECT DATE2, SUM (AMOUNT) from TABEL1 GROUP BY 1;

0

SQL 서버를 사용하는 경우 병합 문을 사용해보십시오.

그냥 명확히하기 위해 - 테이블의 레코드 날짜를 변경하거나 새로운 레코드를 추가해야합니까?

CREATE TABLE #DataTable 
(
    SomeDate DATE, 
    Amount INT 
) 

INSERT #DataTable 
VALUES 
('20170101', 1), 
('20170206', 2), 
('20170309', 3), 
('20170422', 4), 
('20170518', 5) 

DECLARE @NewValues TABLE 
(
    SomeDate DATE, 
    Amount INT 
) 

INSERT @NewValues 
VALUES 
('20170101', 10), --Update 
('20170309', 15), --Update 
('20170612', 6), --Insert 
('20170725', 7) --Insert 

MERGE INTO #DataTable AS tgt 
USING @NewValues AS nv 
    ON nv.SomeDate = tgt.SomeDate 
WHEN NOT MATCHED THEN INSERT 
VALUES 
(nv.SomeDate, nv.Amount) 
WHEN MATCHED THEN UPDATE 
SET tgt.Amount = tgt.Amount + nv.Amount 
OUTPUT $action AS MergeAction, 
     Inserted.SomeDate, 
     Deleted.Amount AS OldValue, 
     Inserted.Amount AS NewValue; 

DROP TABLE #DataTable;