繁体   English   中英

CTE用户定义的功能分组和行重复

CTE user defined functions group by and row duplications

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在其中有多个CTE进行查询,每个CTE都在进行计算,而不是从该CTE中检索需要的母牛,但我的问题是我遇到了可以拥有多个合同的客户,并且他们正在重复工作,我试图通过使用不同或分组,但在这里不起作用的是查询及其答案

WITH    cte
          AS ( SELECT   ISNULL(g.last_id
                               + ROW_NUMBER() OVER ( ORDER BY CustomerId ), 1) AS RowId
                       ,c.[CustomerId] AS CustomerId
                       ,b.Id
                       ,4 AS EntityState
                       ,c.Id AS contractid
               FROM     dbo.Contract c
                        JOIN dbo.BudgetYear AS b ON YEAR(c.CreateDate) = b.Year
                        CROSS JOIN ( SELECT MAX(Id) AS last_id
                                     FROM   [ContractConclusionStatistic]
                                   ) g
               GROUP BY c.[CustomerId]
                       ,last_id
                       ,c.Id
                       ,b.Id
             ),
        cte1
          AS ( SELECT   SUM(dbo.GetContractCost(Id)) OVER ( PARTITION BY [CustomerId] ) AS ProcedureCost
                       ,c.[CustomerId] AS CustomerId -- int
                       ,c.Id AS contractid
               FROM     dbo.Contract c
               WHERE    c.PurchaseMethodId <> 15
               GROUP BY c.[CustomerId]
                       ,Id
             ),
        cte2
          AS ( SELECT   SUM(dbo.GetContractCost(c.Id)) OVER ( PARTITION BY [CustomerId] ) AS SingleVendorCost
                       ,c.[CustomerId] AS CustomerId -- int
                       ,c.Id AS contractid
               FROM     dbo.Contract c
                        JOIN PurchaseSingleVendor p ON c.PurchaseSingleVendorId = p.Id
               WHERE    c.PurchaseMethodId = 15
                        AND c.PurchaseSingleVendorId = 16
                        AND c.PurchaseSingleVendorId = 17
            --and 2 more 
               GROUP BY [c].[CustomerId]
                       ,c.Id
             ),
        cte3
          AS ( SELECT   SUM(dbo.GetContractCost(Id)) OVER ( PARTITION BY [CustomerId] ) AS [CanceledProcedureCost]
                       ,c.[CustomerId] AS CustomerId -- int
                       ,c.Id AS contractid
               FROM     dbo.Contract c
               WHERE    c.PurchaseMethodId = 15
               GROUP BY [c].[CustomerId]
                       ,c.Id
             ),
        cte4
          AS ( SELECT   SUM(dbo.GetContractCost(Id)) OVER ( PARTITION BY [CustomerId] ) AS SingleVendorCost
                       ,c.[CustomerId] AS CustomerId -- int
                       ,c.Id AS contractid
               FROM     dbo.Contract c
               WHERE    c.PurchaseMethodId = 15
               GROUP BY [c].[CustomerId]
                       ,c.Id
             )
     SELECT  DISTINCT
            cte.RowId
        -- ,cte1.CanceledProcedureCost
           ,cte1.ProcedureCost
           ,cte2.SingleVendorCost
           ,cte3.CanceledProcedureCost
           ,cte4.SingleVendorCost
           ,cte.Id AS YearId
           ,cte.CustomerId
           ,cte.contractid
           ,4
     FROM   cte
            LEFT JOIN cte1 ON cte.contractid = cte1.contractid
            LEFT  JOIN cte2 ON cte2.CustomerId = cte.CustomerId
                               AND cte.contractid = cte2.contractid
            LEFT JOIN cte3 ON cte3.CustomerId = cte.CustomerId
                              AND cte.contractid = cte3.contractid
            LEFT JOIN cte4 ON cte4.CustomerId = cte.CustomerId
                              AND cte.contractid = cte4.contractid
     GROUP BY cte.CustomerId
           ,cte.RowId
           ,cte1.ProcedureCost
           ,cte2.SingleVendorCost
           ,cte.contractid
           ,cte3.CanceledProcedureCost
           ,cte4.SingleVendorCost
           ,cte.Id

54  NULL    NULL    174000.00   174000.00   4   18000   1100253 4
55  NULL    NULL    174000.00   174000.00   4   18000   1100254 4
56  345191000.00    NULL    NULL    NULL    4   18000   1100261 4
57  345191000.00    NULL    NULL    NULL    4   18000   1100262 4
58  345191000.00    NULL    NULL    NULL    4   18000   1100276 4
59  345191000.00    NULL    NULL    NULL    4   18000   1100286 4
60  345191000.00    NULL    NULL    NULL    4   18000   1100297 4
61  NULL    NULL    180000.00   180000.00   4   21065   1100188 4
62  NULL    NULL    NULL            NULL    4   21065   1100232 4
63  NULL    NULL    180000.00   180000.00   4   21065   1100255 4
64  NULL    NULL    180000.00   180000.00   4   21065   1100256 4
65  NULL    NULL    180000.00   180000.00   4   21065   1100257 4

任何想法如何摆脱重复? 在这里我选择cte.Contractid只是为了显示原始查询中重复项的来源,我没有选择此列,但仍收到重复项

这是我想要实现的

55  345191000.00    NULL    174000.00   174000.00   4   18000   1100254 4
56  NULL            NULL    180000.00   180000.00   4   21065   1100257 4

对于每个客户ID,我需要记录一条来自多个CTE的数据

1 个回复

删除除客户以外的所有分组依据,如果要每个客户和预算年度的记录,则按预算年度添加一个分组,否则也将其删除。

WITH cte AS 
( SELECT ISNULL(g.last_id, 1)
       + ROW_NUMBER() OVER ( ORDER BY CustomerId ) AS RowId
       ,c.[CustomerId] AS CustomerId
       ,b.Id
       ,YEAR(c.CreateDate) bYear
       ,4 AS EntityState
       ,max(c.Id) AS contractid
  FROM  dbo.Contract c
  JOIN dbo.BudgetYear AS b ON YEAR(c.CreateDate) = b.Year
  CROSS JOIN ( SELECT MAX(Id) AS last_id
               FROM   [ContractConclusionStatistic]
             ) g
  GROUP BY c.[CustomerId], last_id , b.Id,YEAR(c.CreateDate)
), 
cte1 AS 
( SELECT SUM(dbo.GetContractCost(Id)) AS ProcedureCost
       , c.[CustomerId] AS CustomerId -- int
       , YEAR(c.CreateDate) bYear
  FROM     dbo.Contract c
  WHERE    c.PurchaseMethodId <> 15
  GROUP BY c.[CustomerId], YEAR(c.CreateDate)
),
cte2 AS 
( SELECT SUM(dbo.GetContractCost(c.Id)) AS SingleVendorCost
       , c.[CustomerId] AS CustomerId -- int
       , YEAR(c.CreateDate) bYear  
  FROM dbo.Contract c
  JOIN PurchaseSingleVendor p ON c.PurchaseSingleVendorId = p.Id
  WHERE    c.PurchaseMethodId = 15
    AND c.PurchaseSingleVendorId = 16
    AND c.PurchaseSingleVendorId = 17
  GROUP BY [c].[CustomerId], YEAR(c.CreateDate)
),
cte3 AS 
( SELECT SUM(dbo.GetContractCost(Id)) AS [CanceledProcedureCost]
       , c.[CustomerId] AS CustomerId -- int
       , YEAR(c.CreateDate) bYear
  FROM     dbo.Contract c
  WHERE    c.PurchaseMethodId = 15
  GROUP BY [c].[CustomerId], YEAR(c.CreateDate)
),
cte4 AS 
( SELECT SUM(dbo.GetContractCost(Id)) AS SingleVendorCost
       , c.[CustomerId] AS CustomerId -- int
       , YEAR(c.CreateDate) bYear
  FROM     dbo.Contract c
  WHERE    c.PurchaseMethodId = 15
  GROUP BY [c].[CustomerId], YEAR(c.CreateDate)
)
SELECT      cte.RowId
        -- ,cte1.CanceledProcedureCost
           ,cte1.ProcedureCost
           ,cte2.SingleVendorCost
           ,cte3.CanceledProcedureCost
           ,cte4.SingleVendorCost
           ,cte.Id AS YearId
           ,cte.bYear
           ,cte.CustomerId
           ,cte.contractid
           ,4
     FROM   cte
            LEFT JOIN cte1 ON cte.CustomerId= cte1.Customerid
                              and cte.bÝear = cte1.bYear
            LEFT  JOIN cte2 ON cte.CustomerId= cte2.Customerid
                              and cte.bÝear = cte2.bYear
            LEFT JOIN cte3 ON cte.CustomerId= cte3.Customerid
                              and cte.bÝear = cte3.bYear
            LEFT JOIN cte4 ON cte.CustomerId= cte4.Customerid
                              and cte.bÝear = cte4.bYear
1 为另一个CTE返回的每一行在CTE内调用用户定义的函数

我有一个返回多行的CTE查询,我想为返回的每一行执行一个功能。 是否有可能,我在G​​oogle上进行了检查,它说了有关使用临时表来填充结果的信息。 我只想确认 这不是确切的查询,为了简化我所遇到的问题,我已对其进行了简化。 dbo.fnGetApp是一个函数,它接受两个参数v ...

3 在 CTE 中使用用户定义的函数

我有一个简单的函数,用于计算 Oracle 数据库中数据帧中的行数( 这里是本教程中的回收代码)。 如果我想将此函数应用于存储表,它执行得很好: 但是,我想在 CTE 中使用这种类型的函数,如下所示。 出于某种原因,我无法运行它。 有人可以告诉我怎么做吗? 如果这是一个基本问题,我很抱歉 ...

4 CTE串联在组迭代中缺少第一行

我正在尝试将多行值连接到单行中...我已经很接近了,但是意识到下面的查询每次都错过了第一行...我在这里错过了明显的东西吗? 我以前从未使用过CTE,因此我正在努力理解其背后的概念。 提前致谢。 ...

5 从记录类型的单列中分割/提取值,将用户定义的函数应用于多行CTE

使用PostgreSQL 9.2,我定义了一个函数,它接受一个参数并返回一个多列表。 我想将该函数应用于CTE行中的多个参数。 我得到的结果是一列元组,而不是我想要的多列。 以机智: 给定CTE,以下两个SELECT子句相互评估为具有类型record的单列的表: 以下三个都 ...

6 SQL用户定义函数

我目前正在使用用户定义函数,并且很难理解有关函数如何接受一个参数并返回另一个参数的概念。 我有一个包含员工ID和日志ID的表。 UDF应该接受EmployeeID并返回UserLoginID。 UserLoginID是'\\'之后的LogID列的最后一部分。 我需要从表中返回整列。 ...

7 应用用户定义的功能

我有一个用户定义的函数,试图将其应用于矩阵。 也许这个例子可以更好地解释它: 它没有给我我需要的输出。 我究竟做错了什么? ...

2016-02-26 15:27:52 1 181   r/ apply
8 Sybase-用户定义的函数

我有2个用户定义的函数,它们返回一个表:可以说它们是UDF1和UDF2 select * from UDF1(param1) -&gt;返回1个结果 select * from UDF2(param2) -&gt;返回1个结果 问题是我什么时候做 select * fro ...

9 XSL中的用户定义功能

我正在尝试在XSL中创建用户定义的函数“ fetchXMLAttribute”。目前,我仅在其中打印“ abcd”。以下是我的XSL文件 我尝试了一些示例,但都没有用。我发现用户定义函数使用了一些名称空间。即使我将函数写在同一XSL文件中,这真的有必要吗? ...

2015-07-17 06:22:01 1 578   xml/ xslt
10 sqoop用户定义函数

apache sqoop 1或sqoop 2是否支持用户定义的功能? 我们有一个场景,其中数据位于HDFS中,并且想要从HDFS中的记录中提取数据元素,然后插入到RDBMS中。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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