I'm fairly new to SQL. This site has been a great resource and I found answers to many questions so far. Now I'm a little stuck, so it's time for my first question.
I'm working in SQL Server 2012. How do I update FLAG = 'Y'
when START_DATE = (SELECT CONTRACT, MIN(START_DATE) FROM #CONTR GROUP BY CONTRACT)
?
CREATE TABLE #CONTR
(
CONTRACT INT , -- PRIMARY KEY COL1
CONTRACT_LINE INT , -- PRIMARY KEY COL2
START_DATE INT , -- 0 = CURRENT MONTH, -3 = THREE MONTHS IN PAST
FLAG VARCHAR(1) -- 'Y' OR 'N', DEFAULTED TO 'N' WHEN TABLE POPULATED
)
This doesn't seem like it should be that difficult, but I just can't seem to get it to work.
INSERT INTO #CONTR VALUES (1,1,100,'N')
INSERT INTO #CONTR VALUES (1,1,200,'N')
INSERT INTO #CONTR VALUES (2,1,100,'N')
INSERT INTO #CONTR VALUES (2,1,200,'N')
UPDATE
c
SET
c.FLAG = 'Y'
FROM
#CONTR c
JOIN (
SELECT
CONTRACT _CONTRACT ,
MAX(START_DATE) _START_DATE
FROM
#CONTR
GROUP BY
CONTRACT
) mc ON c.CONTRACT = mc.[_CONTRACT] AND c.START_DATE = mc.[_START_DATE]
Another way to do that. It is absolutely the same, just the syntax is different:
UPDATE
c
SET
c.FLAG = 'Y'
FROM
#CONTR c
CROSS APPLY (
SELECT
c1.CONTRACT _CONTRACT
FROM
#CONTR c1
WHERE c1.CONTRACT = c.CONTRACT
GROUP BY
CONTRACT
HAVING MAX(c1.START_DATE) = c.START_DATE
) mc;
And the results:
SELECT * FROM #CONTR
CONTRACT CONTRACT_LINE START_DATE FLAG
1 1 100 N
1 1 200 Y
2 1 100 N
2 1 200 Y
UPDATE #CONTR
SET FLAG = 'Y'
FROM #CONTR C1
JOIN
(SELECT CONTRACT, MIN(START_DATE) AS START_DATE FROM #CONTR GROUP BY CONTRACT) C2
ON C1.START_DATE = C2.START_DATE
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.