繁体   English   中英

使用 String_AGG 创建不同值的列表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM