分组集不是聚合结果

时间:2018-01-16 00:45:45

标签: sql sql-server sql-server-2008 tsql grouping-sets

我最近才开始使用这个功能,所以请原谅这个问题,如果它是无法解释的。

我有一个现有的查询,我已经意识到可以通过使用此查询来创建额外的分组,类似于小计。

在这个例子中,我想要在这样的层次结构中进行聚合:

年份>月份>利润中心>日期

此查询带回的结果示例

enter image description here

正如您所看到的,我的分组集返回零。 我的问题是,为什么?

我的查询在

之下
SELECT 
datepart(yyyy,overview.Date) as 'Year', 
datepart(mm,overview.Date) as'Month',
overview.Date as 'Date',
overview.[Profit Centre],
overview.[Current 
Year Group Bookings],
overview.[Previous Year Group Bookings],
overview.[Current Year Total Covers],
overview.[Previous Year Total Covers],
overview.[Large Group Count]

FROM
(
SELECT 
DISTINCT
CONVERT(date,csd.tendered_date_time) as 'Date',
PCM.profit_center_name as 'Profit Centre',
PCD.profit_center_id,
(
SELECT count(csd2.num_covers)
FROM ig_Business..check_sales_detail csd2
INNER JOIN ig_Dimension..Profit_Center_Dimension PCD2 (NOLOCK) ON 
PCD2.profit_center_dim_id = CSD2.profit_center_dim_id and PCD2.ent_id = 1
WHERE PCD2.profit_center_id = PCD.profit_center_id
AND CONVERT(date,CSD2.tendered_date_time) = 
CONVERT(date,CSD.tendered_date_time)
AND CSD2.num_covers >= 
(CASE 
WHEN PCD.profit_center_id = '77' THEN '8'
WHEN PCD.profit_center_id = '13' THEN '10'
WHEN PCD.profit_center_id IN ('60','61','62','63','64','65') THEN '16'
WHEN PCD.profit_center_id = '14' THEN '10'
WHEN PCD.profit_center_id = '90' THEN '10'
WHEN PCD.profit_center_id = '98' THEN '8' 
WHEN PCD.profit_center_id IN ('74','101') THEN '10'
WHEN PCD.profit_center_id = '194' THEN '10'
WHEN PCD.profit_center_id = '49' THEN '15'
WHEN PCD.profit_center_id IN ('20','21','22','200') THEN '8'
WHEN PCD.profit_center_id = '74' THEN '15'
WHEN PCD.profit_center_id = '26' THEN '10'
WHEN PCD.profit_center_id IN ('86','68') THEN '8'
WHEN PCD.profit_center_id IN ('40','41','42','43') THEN '8'
WHEN PCD.profit_center_id IN ('96','98','99') THEN '10'
WHEN PCD.profit_center_id = '57' THEN '10'
END)
) as 'Current Year Group Bookings',
(
SELECT count(csd2.num_covers)
FROM ig_Business..check_sales_detail csd2
INNER JOIN ig_Dimension..Profit_Center_Dimension PCD2 (NOLOCK) ON 
PCD2.profit_center_dim_id = CSD2.profit_center_dim_id and PCD2.ent_id = 1
WHERE PCD2.profit_center_id = PCD.profit_center_id
AND CONVERT(date,CSD2.tendered_date_time) = 
CONVERT(date,DATEADD(month,-12,CSD.tendered_date_time))
AND CSD2.num_covers >= 
(CASE 
WHEN PCD.profit_center_id = '77' THEN '8'
WHEN PCD.profit_center_id = '13' THEN '10'
WHEN PCD.profit_center_id IN ('60','61','62','63','64','65') THEN '16'
WHEN PCD.profit_center_id = '14' THEN '10'
WHEN PCD.profit_center_id = '90' THEN '10'
WHEN PCD.profit_center_id = '98' THEN '8' 
WHEN PCD.profit_center_id IN ('74','101') THEN '10'
WHEN PCD.profit_center_id = '194' THEN '10'
WHEN PCD.profit_center_id = '49' THEN '15'
WHEN PCD.profit_center_id IN ('20','21','22','200') THEN '8'
WHEN PCD.profit_center_id = '74' THEN '15'
WHEN PCD.profit_center_id = '26' THEN '10'
WHEN PCD.profit_center_id IN ('86','68') THEN '8'
WHEN PCD.profit_center_id IN ('40','41','42','43') THEN '8'
WHEN PCD.profit_center_id IN ('96','98','99') THEN '10'
WHEN PCD.profit_center_id = '57' THEN '10'
END)
) as 'Previous Year Group Bookings',

(
SELECT ISNULL(SUM(csd2.num_covers),0)
FROM ig_Business..check_sales_detail csd2
INNER JOIN ig_Dimension..Profit_Center_Dimension PCD2 (NOLOCK) ON 
PCD2.profit_center_dim_id = CSD2.profit_center_dim_id and PCD2.ent_id = 1
WHERE PCD2.profit_center_id = PCD.profit_center_id
AND CONVERT(date,CSD2.tendered_date_time) = 
CONVERT(date,CSD.tendered_date_time)
AND CSD2.num_covers >= 
(CASE 
WHEN PCD.profit_center_id = '77' THEN '8'
WHEN PCD.profit_center_id = '13' THEN '10'
WHEN PCD.profit_center_id IN ('60','61','62','63','64','65') THEN '16'
WHEN PCD.profit_center_id = '14' THEN '10'
WHEN PCD.profit_center_id = '90' THEN '10'
WHEN PCD.profit_center_id = '98' THEN '8' 
WHEN PCD.profit_center_id IN ('74','101') THEN '10'
WHEN PCD.profit_center_id = '194' THEN '10'
WHEN PCD.profit_center_id = '49' THEN '15'
WHEN PCD.profit_center_id IN ('20','21','22','200') THEN '8'
WHEN PCD.profit_center_id = '74' THEN '15'
WHEN PCD.profit_center_id = '26' THEN '10'
WHEN PCD.profit_center_id IN ('86','68') THEN '8'
WHEN PCD.profit_center_id IN ('40','41','42','43') THEN '8'
WHEN PCD.profit_center_id IN ('96','98','99') THEN '10'
WHEN PCD.profit_center_id = '57' THEN '10'
END)

) as 'Current Year Total Covers',


(
SELECT ISNULL(SUM(csd2.num_covers),0)
FROM ig_Business..check_sales_detail csd2
INNER JOIN ig_Dimension..Profit_Center_Dimension PCD2 (NOLOCK) ON 
PCD2.profit_center_dim_id = CSD2.profit_center_dim_id and PCD2.ent_id = 1
WHERE PCD2.profit_center_id = PCD.profit_center_id
AND CONVERT(date,CSD2.tendered_date_time) = 
CONVERT(date,DATEADD(month,-12,CSD.tendered_date_time))
AND CSD2.num_covers >= 
(CASE 
WHEN PCD.profit_center_id = '77' THEN '8'
WHEN PCD.profit_center_id = '13' THEN '10'
WHEN PCD.profit_center_id IN ('60','61','62','63','64','65') THEN '16'
WHEN PCD.profit_center_id = '14' THEN '10'
WHEN PCD.profit_center_id = '90' THEN '10'
WHEN PCD.profit_center_id = '98' THEN '8' 
WHEN PCD.profit_center_id IN ('74','101') THEN '10'
WHEN PCD.profit_center_id = '194' THEN '10'
WHEN PCD.profit_center_id = '49' THEN '15'
WHEN PCD.profit_center_id IN ('20','21','22','200') THEN '8'
WHEN PCD.profit_center_id = '74' THEN '15'
WHEN PCD.profit_center_id = '26' THEN '10'
WHEN PCD.profit_center_id IN ('86','68') THEN '8'
WHEN PCD.profit_center_id IN ('40','41','42','43') THEN '8'
WHEN PCD.profit_center_id IN ('96','98','99') THEN '10'
WHEN PCD.profit_center_id = '57' THEN '10'
END)
) as 'Previous Year Total Covers',


(CASE 
WHEN PCD.profit_center_id = '77' THEN '8'
WHEN PCD.profit_center_id = '13' THEN '10'
WHEN PCD.profit_center_id IN ('60','61','62','63','64','65') THEN '16'
WHEN PCD.profit_center_id = '14' THEN '10'
WHEN PCD.profit_center_id = '90' THEN '10'
WHEN PCD.profit_center_id = '98' THEN '8' 
WHEN PCD.profit_center_id IN ('74','101') THEN '10'
WHEN PCD.profit_center_id = '194' THEN '10'
WHEN PCD.profit_center_id = '49' THEN '15'
WHEN PCD.profit_center_id IN ('20','21','22','200') THEN '8'
WHEN PCD.profit_center_id = '74' THEN '15'
WHEN PCD.profit_center_id = '26' THEN '10'
WHEN PCD.profit_center_id IN ('86','68') THEN '8'
WHEN PCD.profit_center_id IN ('40','41','42','43') THEN '8'
WHEN PCD.profit_center_id IN ('96','98','99') THEN '10'
WHEN PCD.profit_center_id = '57' THEN '10'
END) AS 'Large Group Count'


FROM ig_business..Check_Sales_Detail CSD (NOLOCK) 
INNER JOIN ig_Dimension..Profit_Center_Dimension PCD (NOLOCK) ON 
PCD.profit_center_dim_id = CSD.profit_center_dim_id and PCD.ent_id = 1
INNER JOIN it_cfg..Profit_Center_Master PCM (NOLOCK) ON PCM.profit_center_id 
= PCD.profit_center_id and PCm.ent_id = 1 
WHERE  
 ( 
  (pcd.profit_center_id = '77' AND csd.num_covers > 8)      
OR
  (pcd.profit_center_id = '13' AND csd.num_covers >= 10)        
OR
  (pcd.profit_center_id IN ('60','61','62','63','64','65') AND 
csd.num_covers > 16) 
OR
  (pcd.profit_center_id = 14 AND csd.num_covers >= 10)      
OR
  (pcd.profit_center_id = 90 AND csd.num_covers >= 10)
OR
  (pcd.profit_center_id = 98 AND csd.num_covers >= 8)
OR
  (pcd.profit_center_id IN ('74','101') AND csd.num_covers >= 10)
OR
  (pcd.profit_center_id = '194' AND csd.num_covers >= 10)
OR
  (pcd.profit_center_id = '49' AND csd.num_covers >= 15)
OR
  (pcd.profit_center_id IN ('20','21','22','200') AND csd.num_covers >= 8)
OR
  (pcd.profit_center_id = '74' AND csd.num_covers >= 15)
OR
  (pcd.profit_center_id = '26' AND csd.num_covers >= 10)
OR    
  (pcd.profit_center_id IN ('86','68') AND csd.num_covers >= 8)
OR
  (pcd.profit_center_id IN ('40','41','42','43') AND csd.num_covers >= 8)
OR
  (pcd.profit_center_id IN ('96','98','99') AND csd.num_covers >= 10)
OR
  (pcd.profit_center_id = '57' AND csd.num_covers >= 10)
)  
AND
CSD.tendered_date_time > CONVERT(date,'2017-01-01') -- We only want 
comparisons from today going forward, i.e. not historical


GROUP BY 
GROUPING SETS
(
(csd.tendered_date_time, PCM.profit_center_name,PCD.profit_center_id),
(datepart(yyyy,csd.tendered_date_time),datepart(mm,csd.tendered_date_time), 
pcm.profit_center_name),
()

)


) overview

ORDER BY overview.[Profit Centre] asc, CONVERT(date,overview.Date) asc

1 个答案:

答案 0 :(得分:1)

我的问题是,为什么(分组设置为零)?

因为您没有使用EventSplit= data.Event.str.split('~',expand=True).stack() Day_split = data.Day.str.split('~',expand=True).stack() new_data = data.join(pd.Series(index=Day_split .index.droplevel(1), data=Day_split .values, name='Day_split ')) new_data = data.join(pd.Series(index=EventSplit.index.droplevel(1), data=EventSplit.values, name='EventSplit')) SUM()等聚合函数,而不是可以归纳为小计。您正在使用一组"相关子查询"它使用COUNT()但是在评估它们时,外部查询只将这些列视为数据(而不是聚合)。

示例(当然未经测试):

COUNT()

注意:你需要注意"隐式转换",如果pcd.profit_center_id是一个整数,那么不要使用' 194',但如果它是varchar或类似的话不要使用整数。我还建议你试着在某些" order"中保留where where子句。所以它更容易阅读。