[英]Use String_AGG to create a list of distinct values?
下面是我尝试使用String_Agg()
返回不同值的代码段。
我尝试创建一个子查询并放置不同的location_name
,但这似乎根本不起作用。 我想知道是否有其他方法可以使用不同的 function 或其他方法来获得所需的结果。
SELECT
ISNULL(ENFORCEMENT.agent_name,'Total') as 'Agent_Name',
market.Market,
enforcement.location_name as Locations,
ENFORCEMENT.[Shift Start] as 'Shift_Start',
ENFORCEMENT.[Shift End] as 'Shift_End',
DATEDIFF(hh, ENFORCEMENT.[Shift Start],enforcement.[Shift End]) as 'Shift_Length',
ENFORCEMENT.Vehicles_Checked as 'Vehicles_Checked',
ENFORCEMENT.Citations as 'Citations',
ENFORCEMENT.Boots as 'Boots',
ISNULL(ENFORCEMENT.Boots * AVGBoot.avgboot,0) as 'Boots_Revenue',
ISNULL(BRemoved.Boots_Removed,0) as 'Boots_Removed',
ENFORCEMENT.Warnings as 'Warnings'
FROM (
SELECT agent_name,
**String_AGG(location_name, ',') as location_name,**
min(created_at) as 'Shift Start',
max(created_at) as 'Shift End' ,
count(distinct case when enforcement.allactions.source_table = 'checks' then [allactions].id
end) as Vehicles_Checked,
count(distinct case when enforcement.allactions.source_table = 'warnings' then [allactions].id
end) as Warnings,
count(distinct case when enforcement.allactions.source_table = 'citations' then [allactions].id
end) as Citations,
count(distinct case when enforcement.allactions.source_table = 'boots' then [allactions].id
end) as Boots,
SUM(Case WHEN enforcement.allactions.source_table = 'boots' then allactions.paid_amount end) as Boots_Revenue,
ROW_NUMBER() OVER (ORDER BY agent_name) AS rn
FROM [enforcement].[allactions]
where
dateadd(d, (datediff(d, 0, [allactions].created_at)) , 0) = dateadd(d, (datediff(d, 0, GetDate() - 1)) , 0)
and agent_name != ' '
Group by
rollUp (agent_name),
CONVERT(varchar(8), created_at, 112)
) AS ENFORCEMENT
我不确定结果,但希望它提供一些想法。 尝试这个:
-- First create the following function
USE <Your Database Name Here>
GO
CREATE FUNCTION [dbo].[udf_GetLocationListByAgent]
(
@Agent_Name varchar(100)
)
RETURNS varchar(max)
AS
BEGIN
DECLARE @LocationList varchar(max) = '';
SELECT @LocationList = @LocationList + ', ' + Location_Name
FROM [enforcement].[allactions]
WHERE Agent_Name = @Agent_Name
GROUP BY Location_Name
ORDER BY Location_Name
RETURN (SELECT STUFF(@LocationList,1,2,''))
END
-- Then try the following.
-- I am not sure of the result because of:
-- i am missing 2 Tables (Market and BRemoved)
-- i don't have sample data to test
;WITH Enforcement AS
(
SELECT
agent_name
, LocationList = dbo.udf_GetLocationListByAgent(Agent_Name)
, ShiftStart = MIN(created_at)
, ShiftEnd = MAX(created_at)
, Vehicles_Checked = SUM(CASE Enforcement.allactions.source_table WHEN 'checks' THEN 1 ELSE 0 END)
, Warnings = SUM(CASE Enforcement.allactions.source_table WHEN 'warnings' THEN 1 ELSE 0 END)
, Citations = SUM(CASE Enforcement.allactions.source_table WHEN 'citations' THEN 1 ELSE 0 END)
, Boots = SUM(CASE Enforcement.allactions.source_table WHEN 'boots' THEN 1 ELSE 0 END)
, Boots_Revenue = SUM(CASE Enforcement.allactions.source_table WHEN 'boots' THEN allactions.paid_amount ELSE 0 END)
, RowNo = ROW_NUMBER() OVER (ORDER BY agent_name)
FROM [Enforcement].[allactions]
WHERE agent_name != ' '
AND dateadd(d, (datediff(d, 0, [allactions].created_at)) , 0) = dateadd(d, (datediff(d, 0, GetDate() - 1)) , 0)
GROUP BY
ROLLUP(agent_name)
, CONVERT(varchar(8), created_at, 112)
)
SELECT
AgentName = ISNULL(Enforcement.agent_name,'Total')
, Market = market.Market
, Locations = Enforcement.LocationList
, Shift_Start = Enforcement.[ShiftStart]
, Shift_End = Enforcement.[ShiftEnd]
, Shift_Length = DATEDIFF(hh, Enforcement.[Shift Start],Enforcement.[Shift End])
, Vehicles_Checked = Enforcement.Vehicles_Checked
, Citations = Enforcement.Citations
, Boots = Enforcement.Boots
, Boots_Revenue = ISNULL(Enforcement.Boots * AVGBoot.avgboot,0)
, Boots_Removed = ISNULL(BRemoved.Boots_Removed,0)
, Warnings = Enforcement.Warnings
FROM Enforcement
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.