【问题标题】:CASE condition and SUM() common table expressions or Group ByCASE 条件和 SUM() 公用表表达式或 Group By
【发布时间】:2020-07-23 16:41:24
【问题描述】:

希望有人能提供帮助?我有一个第 3 方软件,我可以进行自定义 sql 查询,但不能更改任何数据库。努力得到我想要的结果。

我是使用 GROUP BY 还是 CTE 来获得我需要的结果?

WITH CTE AS ( 
SELECT  tblTicketsSummary.fldDateScheduled AS [Scheduled], 
tblTicketsRow.fldStartTime  AS [TIME], tblTicketsRow.fldPs AS 
[s],tblTicketsRow.fldPrice AS PR, 
tblTicketsSummary.fldFirstName+' '+tblTicketsSummary.fldLastName 
AS [Client], ROW_NUMBER() OVER 
(PARTITION BY tblTicketsSummary.fldTicketID ORDER BY 
tblTicketsRow.fldTicketID) AS C, tblTicketsSummary.fldDateClosed 
AS [Date Closed],
 CASE WHEN tblTicketsRow.fldPs ='p' THEN tblTicketsRow.fldPrice  
ELSE £0.00 END AS Product,  
CASE WHEN tblTicketsRow.fldPs ='s' THEN tblTicketsRow.fldPrice  
ELSE £0.00 END AS Services, 
FROM tblTicketsSummary INNER JOIN 
tblTicketsRow ON tblTicketsSummary.fldTicketID = tblTicketsRow.fldTicketID
 WHERE (fldDateVoided IS NULL) AND (NOT(fldDateClosed IS NULL)) 
GetUserDate('AND','fldDateClosed','') AND tblTicketsRow.fldEmployeeName ='Tina Young' 
 AND tblTicketsSummary.fldTotal >1 )
SELECT * FROM  CTE   ORDER BY   Scheduled ASC,  TIME ASC

这给了我下面的结果。我在最后一次选择中删除了 Where c=1 ,我将把它放回最终查询中,这给了我第一个结果,这是我想要的。我正在努力解决的问题是。我想将所有产品的价格和所有服务的价格加在一起,得出销售的产品和服务的总和。然后在最终查询中将服务和产品总计在一起。

Scheduled   TIME s   PR      Client   C Date Closed Product  Services  Total
17/07/2020 17:00 S £10.00 Ben Preston 1 17/07/2020  £0.00    £10.00     s+p
17/07/2020 17:45 S £1.00  Ben Preston 2 17/07/2020  £0.00    £1.00      s+p
17/07/2020       P £19.00 Ben Preston 3 17/07/2020  £19.00   £0.00      s+p
17/07/2020       P £10.00 Ben Preston 4 17/07/2020  £10.00   £0.00      s+p

我想要的结果如下。查询的最后一部分如下。我只能在 3rd 方软件中自定义查询。

 SELECT * FROM  CTE  WHERE c=1 ORDER BY   Scheduled ASC,  TIME ASC 


Scheduled  TIME   Client       C   Date Closed  Product Services   Total
17/07/2020 17:00 Ben Preston   1   17/07/2020   £29.00   £11.00    £40.00

我希望我已经格式化了这个权利,以便人们理解。感谢您提供的任何帮助。

【问题讨论】:

    标签: sql sum sql-order-by case common-table-expression


    【解决方案1】:

    似乎您只需将两个 Group Sums 添加到您现有的 CTE 中,然后将它们添加到您的最终选择中:

    WITH CTE AS ( 
    SELECT  tblTicketsSummary.fldDateScheduled AS [Scheduled], 
       tblTicketsRow.fldStartTime  AS [TIME], 
       tblTicketsRow.fldPs AS [s],tblTicketsRow.fldPrice AS PR, 
       tblTicketsSummary.fldFirstName+' '+tblTicketsSummary.fldLastName AS [Client], 
       ROW_NUMBER() 
       OVER (PARTITION BY tblTicketsSummary.fldTicketID
             ORDER BY tblTicketsRow.fldStartTime) AS C, 
       tblTicketsSummary.fldDateClosed AS [Date Closed],
       
       SUM(CASE WHEN tblTicketsRow.fldPs ='p' THEN tblTicketsRow.fldPrice ELSE £0.00 END)
       OVER (PARTITION BY tblTicketsSummary.fldTicketID) AS Product,  
       
       SUM(CASE WHEN tblTicketsRow.fldPs ='s' THEN tblTicketsRow.fldPrice ELSE £0.00 END)
       OVER (PARTITION BY tblTicketsSummary.fldTicketID) AS Services
    FROM tblTicketsSummary
    INNER JOIN tblTicketsRow
    ON tblTicketsSummary.fldTicketID = tblTicketsRow.fldTicketID
    WHERE (fldDateVoided IS NULL) AND (NOT(fldDateClosed IS NULL)) 
    --GetUserDate('AND','fldDateClosed','') AND tblTicketsRow.fldEmployeeName ='Tina Young' 
     AND tblTicketsSummary.fldTotal >1 )
    SELECT cte.*,
       Product + Services as total
    FROM  CTE
    WHERE C = 1
    ORDER BY   Scheduled ASC,  TIME ASC;
    

    顺便说一句,ROW_NUMBER 上的 ORDER BY tblTicketsRow.fldTicketID 不是基于唯一列,因此无法保证行的顺序。你可能想要order by tblTicketsRow.fldStartTime

    【讨论】:

    • 您也可以使用普通聚合获得预期结果...
    • 嗨 Dnoeth 谢谢你,但我不确定是否输入你提供的代码。我是网页设计者,不是数据库专家。几周来一直在努力解决这个问题。我可以请您将代码粘贴到查询中吗?谢谢
    • 谢谢。在 'tlbTicketsSummaryINNER' 和 CTEWHERE 附近出现 2 个语法错误。有任何想法吗 。再次感谢您的帮助!
    • 似乎第 3 方软件删除了所有换行符,现在 tlbTicketsSummaryINNER 之间没有空格。只需在每行末尾添加一个空格
    • 非常感谢!!我送给你的虚拟啤酒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2019-09-28
    • 2021-01-21
    • 2017-06-09
    • 2014-01-12
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多