The challenge involves validating the GUID values and perform horizontal and vertical count of the characters "1, 2, 3, 4, 5, A, B, C, D, E".
The definition of valid GUID is "The GUID value should contain all the characters 1, 2, 3, 4, 5, A, B, C, D, E".
e.g. In "7FC61235-F252-4E32-BD31-99FB1FC8A574" all the characters given in character set are present while in "7FX61235-X252-4Y32-BZ31-99FB1FC8Z574" some of them are missing even though they both are GUIDs. So the program should accept "7FC61235-F252-4E32-BD31-99FB1FC8A574" as a valid GUID.
A typical GUID looks like 704A9279-B245-4D4E-9616-7ACB6E9DF7A0.
- Sample Data
Guid ------------------------------------ 7FC61235-F252-4E32-BD31-99FB1FC8A574 D031BC00-ADD3-4C40-BE24-A613586FD42C 81B10B95-5A22-4D3A-949A-FF268103A554 ABCDE12345E
- Expected Results
ValidGuid 1 2 3 4 5 A B C D E Sum ------------------------------------ - - - - - - - - - - ----- 7FC61235-F252-4E32-BD31-99FB1FC8A574 3 4 3 2 3 1 2 2 1 1 22 D031BC00-ADD3-4C40-BE24-A613586FD42C 2 2 3 4 1 2 2 3 4 1 24 Vertical Sum 5 6 6 6 4 3 4 5 5 2 46
- Rules
- Output should be sorted in Ascending Order of ValidGuid.
- Consider the character count for only the characters 1,2,3,4,5,A,B,C,D,E.
- The output should be formatted as shown in 'Expected Result'.Column name should be exactly the same and the result must be sorted in Ascending order of ValidGuid.
- 個人解法
DECLARE @t TABLE(Guid VARCHAR(50))
INSERT INTO @t
SELECT '7FC61235-F252-4E32-BD31-99FB1FC8A574' UNION ALL
SELECT 'D031BC00-ADD3-4C40-BE24-A613586FD42C' UNION ALL
SELECT '81B10B95-5A22-4D3A-949A-FF268103A554' UNION ALL
SELECT 'ABCDE12345E'
;
WITH CTE AS -- 跑遞迴並拆解字串
(
SELECT [Guid] , 1 AS Location , SUBSTRING([Guid],1,1) AS String
FROM @t
UNION ALL
SELECT [Guid] , Location + 1 , SUBSTRING([Guid],Location + 1,1)
FROM CTE
WHERE Location < LEN([Guid])
)
SELECT
ISNULL([GUID],'Vertical Sum') AS ValidGuid ,
SUM([1]) AS [1] ,
SUM([2]) AS [2] ,
SUM([3]) AS [3] ,
SUM([4]) AS [4] ,
SUM([5]) AS [5] ,
SUM([A]) AS [A] ,
SUM([B]) AS [B] ,
SUM([C]) AS [C] ,
SUM([D]) AS [D] ,
SUM([E]) AS [E] ,
SUM([SUM]) AS [SUM]
FROM
(
SELECT [GUID] , [1],[2],[3],[4],[5],[A],[B],[C],[D],[E] ,
[1] + [2] + [3] + [4] + [5] + [A] + [B] + [C] + [D] + [E] AS [SUM]
FROM
(
SELECT S.[GUID] , S.String
FROM CTE AS S
JOIN
(
SELECT [Guid] , COUNT(String) AS Counts
FROM CTE
WHERE String LIKE '[0-9A-F]' -- 0-9 或 A-F 的數字
GROUP BY [Guid]
HAVING COUNT(String) = 32 -- 不包含 '-' 符號,GUID 長度為 32
) AS C ON S.GUID = C.GUID
) AS P
PIVOT
(
COUNT(String) FOR String IN ([1],[2],[3],[4],[5],[A],[B],[C],[D],[E])
) AS PV
WHERE
-- 根據題目給的條件
[1] > 0 AND [2] > 0 AND [3] > 0 AND [4] > 0 AND [5] > 0 AND
[A] > 0 AND [B] > 0 AND [C] > 0 AND [D] > 0 AND [E] > 0
) AS T
GROUP BY [GUID] WITH ROLLUP
- 有效 GUID 判斷
SELECT [Guid] , COUNT(String) AS Counts FROM CTE WHERE String LIKE '[0-9A-F]' -- 判斷每個字元為 0-9 或 A-F 的數字 GROUP BY [Guid] HAVING COUNT(String) = 32 -- 不包含 '-' 符號,GUID 長度為 32
沒有留言:
張貼留言