Okay first off yes you can store values in columns its called a table/array and you put those in the table.
here is a sample code because I'm sure you understand how to do this and I don't really understand how to explain it. if you have any more questions feel free to PM me or put a comment so I can help you out some more.
local datastoreservice = game:GetService('DataStoreService')
local datastore = datastoreservice:GetDataStore('pointsTable')
local sessiondata = {}
local function onPlayerAdded(player)
local leaderstats = Instance.new('Folder')
leaderstats.Name = 'leaderstats'
local points = Instance.new('IntValue', leaderstats)
points.Name = 'Points'
local kills = Instance.new('IntValue', leaderstats)
kills.Name = 'Kills'
local deaths = Instance.new('IntValue', leaderstats)
deaths.Name = 'Deaths'
local key = ('user_'..tostring(player.UserId))
local data = datastore:GetAsync(key) or {
Points = 0,
Kills = 0,
Deaths = 0,
}
points.Value = data.Points
kills.Value = data.Kills
deaths.Value = data.Deaths
leaderstats.Parent = player
sessiondata[key] = data
end
local function onPlayerRemoving(player)
local leaderstats = player:WaitForChild('leaderstats')
local points, kills, deaths = leaderstats:WaitForChild('Points'), leaderstats:WaitForChild('Kills'), leaderstats:WaitForChild('Deaths')
local key = ('user_'..tostring(player.UserId))
local data = sessiondata[key]
if data ~= nil then
data.Points = points.Value
data.Kills = kills.Value
data.Deaths = death.Value
local success, message = pcall(function() datastore:SetAsync(key, data) end)
if (success == false) then
warn('An error has occured: '..message)
end
sessondata[key] = nil
end
end
for _, v in pairs (players:GetPlayers()) do onPlayerAdded(v) end
players.PlayerAdded:connect(onPlayerAdded)
players.PlayerRemoving:connect(onPlayerRemoving)