我有以下问题:
查询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)
如您所见,上一个查询的结果用于以下查询,请考虑这一点 感谢
答案 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以获取更多信息。