将4个查询合并为一个

时间:2014-06-19 12:04:15

标签: sql sql-server

我有以下问题:

查询1:

    SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
into #t1
FROM RG_SalesOut_Report so
WHERE so.Block=0 AND so.[All Sources]='SalesOUT'AND so.Value_CP>0 AND so.Amount>0 AND
so.Brand in('Brand 1', 'Brand 2')
GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product

查询2:

select t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product,
Sum(t1.Amount) AS Amount, Sum(t1.Value_CP) AS Value_CP
into #t2
from #t1 t1
group by t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product

查询3:

select ROW_NUMBER() over(order by t2.ClientID desc) as ID, *, CONCAT(t2.ClientID, t2.Product) AS Code
into #t3
from #t2 t2
group by t2.ClientID, t2.CustomerGroup, t2.StatementID, t2.Brand, t2.Product, t2.Amount, t2.Value_CP, CONCAT(t2.ClientID, t2.Product)
ORDER BY t2.ClientID DESC, t2.Product, t2.StatementID desc

查询4:

select tab1.ClientID, tab1.CustomerGroup, convert(varchar,(CONVERT(date,tab1.StatementID,104)),104) AS StatementID, tab1.Brand,
tab1.Product, tab1.Amount, tab1.Value_CP, IIF(tab1.code=tab2.code, DATEDIFF(MONTH,tab2.StatementID, tab1.StatementID), 0) AS M_SALES
FROM #t3 tab1
RIGHT JOIN #t3 tab2
ON tab1.ID=tab2.ID-1
where tab1.StatementID >= '01.01.2013'
order by tab1.ID asc

如何将4个查询合并为一个? 我正在使用SQL Server 2012,我在#T3中使用order by,因为我在计算字段中获取了错误的数据(M_Sales)

如您所见,上一个查询的结果用于以下查询,请考虑这一点 感谢

2 个答案:

答案 0 :(得分:1)

您可以使用Common table expressions代替临时表:

WITH T1 AS
(   SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
    Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
    FROM RG_SalesOut_Report so
    WHERE so.Block=0 AND so.[All Sources]='SalesOUT'AND so.Value_CP>0 AND so.Amount>0 AND
    so.Brand in('Brand 1', 'Brand 2')
    GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product
), T2 AS
(   select t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product,
    Sum(t1.Amount) AS Amount, Sum(t1.Value_CP) AS Value_CP
    from t1
    group by t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product
), T3 AS
(   select ROW_NUMBER() over(order by t2.ClientID desc) as ID, *, CONCAT(t2.ClientID, t2.Product) AS Code
    from t2
    group by t2.ClientID, t2.CustomerGroup, t2.StatementID, t2.Brand, t2.Product, t2.Amount, t2.Value_CP, CONCAT(t2.ClientID, t2.Product)
)
select tab1.ClientID, tab1.CustomerGroup, convert(varchar,(CONVERT(date,tab1.StatementID,104)),104) AS StatementID, tab1.Brand,
tab1.Product, tab1.Amount, tab1.Value_CP, IIF(tab1.code=tab2.code, DATEDIFF(MONTH,tab2.StatementID, tab1.StatementID), 0) AS M_SALES
FROM t3 tab1
RIGHT JOIN t3 tab2
ON tab1.ID=tab2.ID-1
where tab1.StatementID >= '01.01.2013'
order by tab1.ID asc;

你的最终选择是有缺陷的,你的外表是tab1,但你的where子句where tab1.StatementID >= '01.01.2013'确保tab1中的任何行都没有空的StatementID,实质上是你的右连接进入内部联盟。

我相当确定您可以将整个查询简化为:

WITH T1 AS
(   SELECT  so.ClientID, 
            CustomerGroup = 'All Channels', 
            so.StatementID, 
            so.Brand, 
            so.Product,
            Code = CONCAT(so.ClientID, so.Product),
            Amount = SUM(so.Amount), 
            Value_CP = SUM(so.Value_CP)
    FROM    RG_SalesOut_Report so
    WHERE   so.Block = 0 
    AND     so.[All Sources] = 'SalesOUT'
    AND     so.Value_CP > 0 
    AND     so.Amount > 0 
    AND     so.Brand IN ('Brand 1', 'Brand 2')
    GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product
)
SELECT  ClientID, 
        CustomerGroup, 
        StatementID,
        Brand,
        Product, 
        Amount, 
        Value_CP, 
        M_SALES = IIF(Code = LEAD(code) OVER(ORDER BY ClientID DESC),
                        DATEDIFF(MONTH,LEAD(StatementID) OVER(ORDER BY ClientID), tab1.StatementID), 
                        0)
FROM    t1
WHERE   StatementID >= '01.01.2013'
ORDER BY ID ASC;

答案 1 :(得分:0)

如果您看到,您的查询1和查询2将提供与在相同字段上进行分组相同的输出。 然后你又要在他们的较小的领域做一个小组。

对于这种情况,按立方体分组是最佳选择。

它将为您提供逐个表达式的每个可能字段组合的聚合,您可以根据您的要求使用它。

检查此网址http://technet.microsoft.com/en-in/library/bb522495(v=sql.105).aspx以获取更多信息。