2015-01-20 3 views
1

쿼리는 평일 평균 청구서를 반환하고 타이밍도 현명합니다. 다음 쿼리는 다중 유니온을 사용합니다. 단일 쿼리로 모두를 결합하려고합니다. 어떻게해야합니까?단일 쿼리에서 복수 공용 구조체를 결합하는 방법

select 
     a.Month, 
     'Weekday' as Type, 
     'Lunch' as 'Sale', 
     sum(case 
      when a.siteId = '102' then a.AvgBill 
      else '--' 
     end) as '102', 
     sum(case 
      when a.siteId = '103' then a.AvgBill 
      else '--' 
     end) as '103', 
     sum(case 
      when a.siteId = '104' then a.AvgBill 
      else '--' 
     end) as '104', 
     sum(case 
      when a.siteId = '105' then a.AvgBill 
      else '--' 
     end) as '105', 
     sum(case 
      when a.siteId = '106' then a.AvgBill 
      else '--' 
     end) as '106' 
    from 
     (select 
      date_format(o.dayStatus, '%M') as Month, 
       c.companyId as CompanyId, 
       o.companyId as siteId, 
       o.bill, 
       round((sum(o.bill)/count(orderId)), 2) as AvgBill, 
       date_format(DTTM, '%a') as Day 
     from 
      orders o, mdm_sites s, mdm_company c 
     where 
      s.siteId = o.companyId 
       and o.isBilled = 1 
       and billMode = 0 
       and s.companyid = c.CompanyId 
       and time(DTTM) <= '15:00' 
       and date_format(DTTM, '%a') not in ('Sat' , 'Sun') 
       and year(o.dayStatus) = (2014) 
       and case 
       when 0 in (1) then c.companyId in (c.companyid) 
       else c.companyId in (1) 
      end 
       and case 
       when 0 in (0) then o.companyId in (o.companyId) 
       else o.companyId in (0) 
      end 
       and case 
       when 0 in (12) then month(o.dayStatus) in (month(o.dayStatus)) 
       else month(o.dayStatus) in (12) 
      end 
     group by c.companyId , o.companyId) as a 
    group by a.CompanyId 
    union (select 
     a.Month, 
     'Weekday' as Type, 
     'Evening' as 'Sale', 
     sum(case 
      when a.siteId = '102' then a.AvgBill 
      else '--' 
     end) as '102', 
     sum(case 
      when a.siteId = '103' then a.AvgBill 
      else '--' 
     end) as '103', 
     sum(case 
      when a.siteId = '104' then a.AvgBill 
      else '--' 
     end) as '104', 
     sum(case 
      when a.siteId = '105' then a.AvgBill 
      else '--' 
     end) as '105', 
     sum(case 
      when a.siteId = '106' then a.AvgBill 
      else '--' 
     end) as '106' 
    from 
     (select 
      date_format(o.daystatus, '%M') as Month, 
       c.companyId as CompanyId, 
       o.companyId as siteId, 
       o.bill, 
       round((sum(o.bill)/count(orderId)), 2) as AvgBill, 
       date_format(DTTM, '%a') as Day 
     from 
      orders o, mdm_sites s, mdm_company c 
     where 
      s.siteId = o.companyId 
       and o.isBilled = 1 
       and billMode = 0 
       and s.companyid = c.CompanyId 
       and time(DTTM) > '15:00' 
       and time(DTTM) < '19:00' 
       and date_format(DTTM, '%a') not in ('Sat' , 'Sun') 
       and year(o.dayStatus) = (2014) 
       and case 
       when 0 in (1) then c.companyId in (c.companyid) 
       else c.companyId in (1) 
      end 
       and case 
       when 0 in (0) then o.companyId in (o.companyId) 
       else o.companyId in (0) 
      end 
       and case 
       when 0 in (12) then month(o.dayStatus) in (month(o.dayStatus)) 
       else month(o.dayStatus) in (12) 
      end 
     group by c.companyId , o.companyId) as a 
    group by a.CompanyId) union (select 
     a.Month, 
     'Weekday' as Type, 
     'Dinner' as 'Sale', 
     sum(case 
      when a.siteId = '102' then a.AvgBill 
      else '--' 
     end) as '102', 
     sum(case 
      when a.siteId = '103' then a.AvgBill 
      else '--' 
     end) as '103', 
     sum(case 
      when a.siteId = '104' then a.AvgBill 
      else '--' 
     end) as '104', 
     sum(case 
      when a.siteId = '105' then a.AvgBill 
      else '--' 
     end) as '105', 
     sum(case 
      when a.siteId = '106' then a.AvgBill 
      else '--' 
     end) as '106' 
    from 
     (select 
      date_format(o.dayStatus, '%M') as Month, 
       c.companyId as CompanyId, 
       o.companyId as siteId, 
       o.bill, 
       round((sum(o.bill)/count(orderId)), 2) as AvgBill, 
       date_format(DTTM, '%a') as Day 
     from 
      orders o, mdm_sites s, mdm_company c 
     where 
      s.siteId = o.companyId 
       and o.isBilled = 1 
       and billMode = 0 
       and s.companyid = c.CompanyId 
       and time(DTTM) >= '19:00' 
       and date_format(DTTM, '%a') not in ('Fri' , 'Sat', 'Sun') 
       and year(o.dayStatus) = (2014) 
       and case 
       when 0 in (1) then c.companyId in (c.companyid) 
       else c.companyId in (1) 
      end 
       and case 
       when 0 in (0) then o.companyId in (o.companyId) 
       else o.companyId in (0) 
      end 
       and case 
       when 0 in (12) then month(o.dayStatus) in (month(o.dayStatus)) 
       else month(o.dayStatus) in (12) 
      end 
     group by c.companyId , o.companyId) as a 
    group by a.CompanyId) union (select 
     a.Month, 
     'Weekend' as Type, 
     'Lunch' as 'Sale', 
     sum(case 
      when a.siteId = '102' then a.AvgBill 
      else '--' 
     end) as '102', 
     sum(case 
      when a.siteId = '103' then a.AvgBill 
      else '--' 
     end) as '103', 
     sum(case 
      when a.siteId = '104' then a.AvgBill 
      else '--' 
     end) as '104', 
     sum(case 
      when a.siteId = '105' then a.AvgBill 
      else '--' 
     end) as '105', 
     sum(case 
      when a.siteId = '106' then a.AvgBill 
      else '--' 
     end) as '106' 
    from 
     (select 
      date_format(o.daystatus, '%M') as Month, 
       c.companyId as CompanyId, 
       o.companyId as siteId, 
       o.bill, 
       round((sum(o.bill)/count(orderId)), 2) as AvgBill, 
       date_format(DTTM, '%a') as Day 
     from 
      orders o, mdm_sites s, mdm_company c 
     where 
      s.siteId = o.companyId 
       and o.isBilled = 1 
       and billMode = 0 
       and s.companyid = c.CompanyId 
       and time(DTTM) <= '15:00' 
       and date_format(DTTM, '%a') in ('Sat' , 'Sun') 
       and year(o.dayStatus) = (2014) 
       and case 
       when 0 in (1) then c.companyId in (c.companyid) 
       else c.companyId in (1) 
      end 
       and case 
       when 0 in (0) then o.companyId in (o.companyId) 
       else o.companyId in (0) 
      end 
       and case 
       when 0 in (12) then month(o.dayStatus) in (month(o.dayStatus)) 
       else month(o.dayStatus) in (12) 
      end 
     group by c.companyId , o.companyId) as a 
    group by a.CompanyId) union (select 
     a.Month, 
     'Weekend' as Type, 
     'Evening' as 'Sale', 
     sum(case 
      when a.siteId = '102' then a.AvgBill 
      else '--' 
     end) as '102', 
     sum(case 
      when a.siteId = '103' then a.AvgBill 
      else '--' 
     end) as '103', 
     sum(case 
      when a.siteId = '104' then a.AvgBill 
      else '--' 
     end) as '104', 
     sum(case 
      when a.siteId = '105' then a.AvgBill 
      else '--' 
     end) as '105', 
     sum(case 
      when a.siteId = '106' then a.AvgBill 
      else '--' 
     end) as '106' 
    from 
     (select 
      date_format(o.dayStatus, '%M') as Month, 
       c.companyId as CompanyId, 
       o.companyId as siteId, 
       o.bill, 
       round((sum(o.bill)/count(orderId)), 2) as AvgBill, 
       date_format(DTTM, '%a') as Day 
     from 
      orders o, mdm_sites s, mdm_company c 
     where 
      s.siteId = o.companyId 
       and o.isBilled = 1 
       and billMode = 0 
       and s.companyid = c.CompanyId 
       and time(DTTM) > '15:00' 
       and time(DTTM) < '19:00' 
       and date_format(DTTM, '%a') in ('Sat' , 'Sun') 
       and year(o.dayStatus) = (2014) 
       and case 
       when 0 in (1) then c.companyId in (c.companyid) 
       else c.companyId in (1) 
      end 
       and case 
       when 0 in (0) then o.companyId in (o.companyId) 
       else o.companyId in (0) 
      end 
       and case 
       when 0 in (12) then month(o.dayStatus) in (month(o.dayStatus)) 
       else month(o.dayStatus) in (12) 
      end 
     group by c.companyId , o.companyId) as a 
    group by a.CompanyId) union (select 
     a.Month, 
     'Weekend' as Type, 
     'Dinner' as 'Sale', 
     sum(case 
      when a.siteId = '102' then a.AvgBill 
      else '--' 
     end) as '102', 
     sum(case 
      when a.siteId = '103' then a.AvgBill 
      else '--' 
     end) as '103', 
     sum(case 
      when a.siteId = '104' then a.AvgBill 
      else '--' 
     end) as '104', 
     sum(case 
      when a.siteId = '105' then a.AvgBill 
      else '--' 
     end) as '105', 
     sum(case 
      when a.siteId = '106' then a.AvgBill 
      else '--' 
     end) as '106' 
    from 
     (select 
      date_format(o.dayStatus, '%M') as Month, 
       c.companyId as CompanyId, 
       o.companyId as siteId, 
       o.bill, 
       round((sum(o.bill)/count(orderId)), 2) as AvgBill, 
       date_format(DTTM, '%a') as Day 
     from 
      orders o, mdm_sites s, mdm_company c 
     where 
      s.siteId = o.companyId 
       and o.isBilled = 1 
       and billMode = 0 
       and s.companyid = c.CompanyId 
       and time(DTTM) >= '19:00' 
       and date_format(DTTM, '%a') in ('Fri' , 'Sat', 'Sun') 
       and year(o.dayStatus) = (2014) 
       and case 
       when 0 in (1) then c.companyId in (c.companyid) 
       else c.companyId in (1) 
      end 
       and case 
       when 0 in (0) then o.companyId in (o.companyId) 
       else o.companyId in (0) 
      end 
       and case 
       when 0 in (12) then month(o.dayStatus) in (month(o.dayStatus)) 
       else month(o.dayStatus) in (12) 
      end 
     group by c.companyId , o.companyId) as a 
    group by a.CompanyId); 


the output of above query 

month  Type Sale 102  103 104  105  106 
------------------------------------------------------------------ 
December Weekday Lunch 566.63 530.19 644.9 556.9 467.65 
December Weekday Evening 433.89 404.69 457.18 547.22 396.6 
December Weekday Dinner 427.68 354.54 371.42 386.21 366.03 
December Weekend Lunch 410.57 381.36 383.86 365.94 394.14 
December Weekend Evening 418.45 305.31 429.12 464.81 301.9 
December Weekend Dinner 415.91 374.95 375.28 376.93 360.45 

어떻게 감사

+0

당신은 핵심 문제를 포함하는 쿼리의 단순화 된 버전을 게시 할 수 있습니까? 그렇지 않으면 나는 누군가가 그것을 통과 할 것이라는 점을 의심한다. –

+0

쿼리가 더 많은 시간이 걸리므로 .... 더 짧은 시간에 실행하고 싶습니다. –

답변

0

는 피벗 여기에 이상적인 솔루션을하고 실행 계획을 절약 할 수 단일 쿼리에서이 작업을 수행 할 수 있습니다. 피벗 그룹은 월, 유형, 판매입니다. 계산 그룹은 102103104105106이됩니다.

피벗은 모두 단일 쿼리에서도 수행됩니다. 피벗에 대한

일반 가이드 : https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

당신이 달성하려고하는 것과 매우 유사합니다 예 : http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx

관련 문제