Sql 将2个复杂查询合并为1个

Sql 将2个复杂查询合并为1个,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我试图找出是否有办法将这两个查询合并为一个查询。我已经到了我所知的极限,不知道这是否可能。 这是第一个查询,该查询获取一个月内每个地点去年每天的销售额: 然后,第二个查询根据当月每天的总销售额计算一个比率,以供以后使用: 我尝试将第一个查询用作第二个查询组by from子句中的子查询,但这不允许我在最外层的select语句中选择那些无法绑定多部分标识符的列 以及在具有相同问题的第二个查询结束时将第一个查询放入join子句 我可能遗漏了一些东西,但我对SQL还是相当陌生,因此非常感谢您提供的

我试图找出是否有办法将这两个查询合并为一个查询。我已经到了我所知的极限,不知道这是否可能。

这是第一个查询,该查询获取一个月内每个地点去年每天的销售额:

然后,第二个查询根据当月每天的总销售额计算一个比率,以供以后使用:

我尝试将第一个查询用作第二个查询组by from子句中的子查询,但这不允许我在最外层的select语句中选择那些无法绑定多部分标识符的列

以及在具有相同问题的第二个查询结束时将第一个查询放入join子句


我可能遗漏了一些东西,但我对SQL还是相当陌生,因此非常感谢您提供的任何帮助或只是一个指向正确方向的指针!:

在第一次查询中,似乎只需计算比率

您可以使用相关子查询来执行此操作

SELECT
...
convert(money, sum(ri.ExtendedAmount)/(SELECT sum(ri2.ExtendedAmount)
                                       FROM rpt.SalesReceiptItem ri2
                                       WHERE ri2.LocationId=ri.LocationId
                                      )
) AS ratio  --extended amount/total extended amount for this location
您可以尝试使用和:


sumcte.LY_NetSalesAmount over partition by cte.LocationId为您提供每个LocationId的总和。代码假定此和始终为非零。否则,将发生除以0的错误。

那么您只是试图避免使用LY_数据临时表?或者该查询还有其他问题吗?1查询解决方案是否仍必须将其全部插入LY_Data2?@ElementZero我想要一个临时表。As LY_数据2与LY_数据相同,只是有另一个计算列。代码现在按预期工作,但我想知道是否有更简单/优雅的解决方案。@MartinNavarro 1查询解决方案将插入LY_数据临时表中。我试图避免在查询中使用2个临时表,但这并不完全有效SalesReceiptItem'没有聚合数据,因此您基本上是将相同的值彼此除以,因为WHERE子句实际上不做任何事情。WHERE子句不做任何事情是不正确的。WHERE子句指定子查询返回相关位置的整个SUMextended金额。外部查询按位置和接收日期分组。子查询仅按位置分组。您没有注意到SUM函数在子查询中的使用吗?这是你的聚合。这就是我所想的,但是当对数据运行时,它产生的值比原始2查询结果或这里的CTE答案的预期值小得多。+1&如果你使用窗口函数-从而消除了连接的需要-你可以不使用CTE,而是使用一个简单的子查询。我同意,但如果我不知道CTE或窗口函数,那么我可能会不知所措地将它们都放在一个查询中”\_ツ_/“行得通!我知道CTE的,但从来没有使用过,所以我不知道如何开始。谢谢
if object_id('tempdb..#LY_Data2') is not null drop table #LY_Data2
select 
    [LocationId]            = ly.LocationId,
    [LY_Date]               = ly.LY_Date,
    [LY_Trans]              = ly.LY_Trans,
    [LY_RetailAmount]       = ly.LY_RetailAmount,
    [LY_NetSalesAmount]     = ly.LY_NetSalesAmount,
    [Ratio]                 = ly.LY_NetSalesAmount / t.MonthlySales
into #LY_Data2
from ( 
        select
            [LocationId]        = ly.LocationId,
            [MonthlySales]      = sum(ly.LY_NetSalesAmount)
        from #LY_Data ly
        group by
            ly.LocationId
) t
join #LY_Data ly
    on t.LocationId = ly.LocationId
SELECT
...
convert(money, sum(ri.ExtendedAmount)/(SELECT sum(ri2.ExtendedAmount)
                                       FROM rpt.SalesReceiptItem ri2
                                       WHERE ri2.LocationId=ri.LocationId
                                      )
) AS ratio  --extended amount/total extended amount for this location
if object_id('tempdb..#LY_Data') is not null drop table #LY_Data

;with
    cte AS
    (
        select  
            [LocationId]            = ri.LocationId,
            [LY_Date]               = convert(date, ri.ReceiptDate),
            [LY_Trans]              = count(distinct ri.SalesReceiptId),
            [LY_SoldQty]            = convert(money, sum(ri.Qty)),
            [LY_RetailAmount]       = convert(money, sum(ri.ExtendedPrice)),
            [LY_NetSalesAmount]     = convert(money, sum(ri.ExtendedAmount))
        from rpt.SalesReceiptItem ri
        join #Location l
            on ri.LocationId = l.Id
        where ri.Ignored = 0
            and ri.LineType = 1 /*Item*/
            and ri.ReceiptDate between @_LYDateFrom and @_LYDateTo
        group by 
            ri.LocationId, 
            ri.ReceiptDate
    )

select
    [LocationId]        = cte.LocationId,
    [LY_Date]           = cte.LY_Date,
    ...
    [Ratio]             = cte.LY_NetSalesAmount / sum(cte.LY_NetSalesAmount) over (partition by cte.LocationId)
into #LY_Data
from cte