从表SQL中提取所有价格

问题描述 投票:1回答:2

我有以下SQL查询,它是从选定时期总结旅游税。

SELECT
     BTR_DESCRIPTION AS TOURIST_TAX_NAME,
     ISNULL(BREAG_TOURIST_TAX_PRICE,0) AS PRICE,
     SUM(DATEDIFF(d, BRE_DATEFROM, BRE_DATETO)) AS QUANTITY,
     ISNULL(BREAG_TOURIST_TAX_PRICE,0) * SUM(DATEDIFF(d, BRE_DATEFROM, BRE_DATETO)) AS FINAL_PRICE
FROM BOS_RESERVATION
     LEFT OUTER JOIN BOS_RESADDGUEST ON BREAG_BRE_ID = BRE_ID
     LEFT OUTER JOIN BOS_TAX_REASONS ON BTR_ID = BREAG_BTR_ID
WHERE BREAG_DATEFROM >= '2018-02-28' AND BREAG_DATETO <= '2018-03-31'
GROUP BY BTR_DESCRIPTION, BREAG_TOURIST_TAX_PRICE

查询结果:

enter image description here

现在我想要从FINAL_PRICE行中汇总所有值。所以结果必须是:5,652但我不知道该怎么做。我尝试了以下SQL:

SUM(ISNULL(BREAG_TOURIST_TAX_PRICE,0) * SUM(DATEDIFF(d, BRE_DATEFROM, BRE_DATETO))) AS FINAL_PRICE_SUM

但这给了我错误:无法对包含聚合或子查询的表达式执行聚合函数。

你能帮我解决一下如何从FINAL_PRICE行汇总所有值吗?

谢谢!

sql sql-server
2个回答
1
投票

你可以这样做:

WITH AggregatedTable as (SELECT
     BTR_DESCRIPTION AS TOURIST_TAX_NAME,
     ISNULL(BREAG_TOURIST_TAX_PRICE,0) AS PRICE,
     SUM(DATEDIFF(d, BRE_DATEFROM, BRE_DATETO)) AS QUANTITY,
     ISNULL(BREAG_TOURIST_TAX_PRICE,0) * SUM(DATEDIFF(d, BRE_DATEFROM, BRE_DATETO)) AS FINAL_PRICE
FROM BOS_RESERVATION
     LEFT OUTER JOIN BOS_RESADDGUEST ON BREAG_BRE_ID = BRE_ID
     LEFT OUTER JOIN BOS_TAX_REASONS ON BTR_ID = BREAG_BTR_ID
WHERE BREAG_DATEFROM >= '2018-02-28' AND BREAG_DATETO <= '2018-03-31'
GROUP BY BTR_DESCRIPTION, BREAG_TOURIST_TAX_PRICE)

Select at.*, 
    (SELECT SUM(FINAL_PRICE) from AggregatedTable)) as Total_FP 
from AggregatedTable AS at

1
投票

如果您想要总的最终价格,请使用CTE或子查询:

WITH r as (
      SELECT BTR_DESCRIPTION AS TOURIST_TAX_NAME,
             COALESCE(BREAG_TOURIST_TAX_PRICE, 0) AS PRICE,
             SUM(DATEDIFF(day, BRE_DATEFROM, BRE_DATETO)) AS QUANTITY,
             COALESCE(BREAG_TOURIST_TAX_PRICE, 0) * SUM(DATEDIFF(day, BRE_DATEFROM, BRE_DATETO)) AS FINAL_PRICE
      FROM BOS_RESERVATION LEFT OUTER JOIN
           BOS_RESADDGUEST
           ON BREAG_BRE_ID = BRE_ID LEFT OUTER JOIN
           BOS_TAX_REASONS
           ON BTR_ID = BREAG_BTR_ID
      WHERE BREAG_DATEFROM >= '2018-02-28' AND BREAG_DATETO <= '2018-03-31'
      GROUP BY BTR_DESCRIPTION, BREAG_TOURIST_TAX_PRICE
     )
SELECT SUM(FINAL_PRICE)
FROM r;
© www.soinside.com 2019 - 2024. All rights reserved.