【问题标题】:What is the best way to rewrite this query by removing sub-queries from select clause?通过从 select 子句中删除子查询来重写此查询的最佳方法是什么?
【发布时间】:2012-10-03 18:50:25
【问题描述】:

我不知道如何优化此查询,也没有找到类似的查询作为示例。

重写此查询的最佳方法是什么,以便在 select 子句中不包含如此多的子查询以实现按月/品牌 ID 分组的相同结果?

DBMS 是 SQL Server。

select
    o.brand_id,
    count(o.item_id) as "Total bought items",
    count(o.sell_date) as "Total sold items",
     /* Amount of sold items grouped by month per item */
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 1 and obj.brand_id = b.brand_id) as "Jan",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 2 and obj.brand_id = b.brand_id) as "Feb",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 3 and obj.brand_id = b.brand_id) as "Mar",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 4 and obj.brand_id = b.brand_id) as "Apr",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 5 and obj.brand_id = b.brand_id) as "May",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 6 and obj.brand_id = b.brand_id) as "Jun",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 7 and obj.brand_id = b.brand_id) as "Jul",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 8 and obj.brand_id = b.brand_id) as "Aug",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 9 and obj.brand_id = b.brand_id) as "Sep",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 10 and obj.brand_id = b.brand_id) as "Oct",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 11 and obj.brand_id = b.brand_id) as "Nov",
    (select count(obj.sell_date) from tab_object as obj where month(obj.install_date) = 12 and obj.brand_id = b.brand_id) as "Dec"
from  tab_brand as b
left join tab_object as o on b.brand_id = o.brand_id
                            and year(o.sell_date) = 2012
where b.brand_id in (1234, 1324, 1423, 2314)
group by b.brand_id
order by b.brand_id;

【问题讨论】:

    标签: sql-server performance tsql


    【解决方案1】:

    您正在寻找 PIVOT http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx 并将其结果加入查询以提供总数

    select TotalBought, TotalSold, months.* from
    (
    select 
        o.brand_id,
        count(o.item_id) as TotalBought, 
        count(o.sell_date) as TotalSold
    from tab_object o   
    where year(sell_date)=2012
    group by brand_id
    ) totals
        left join
    (    
    select * 
      from (select brand_id, sell_date, left(datename(month,install_date),3) as InstallMonth 
            from tab_object where brand_id in (1234,1324,1423,2314) and year(sell_date)=2012
      ) src 
      pivot 
      ( count(sell_date) for installmonth in ([Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec])) p
    ) months
        on totals.brand_id = months.brand_id
    

    您似乎也不使用品牌表

    【讨论】:

      【解决方案2】:

      你会用吗

      select
          o.brand_id,
          count(o.item_id) as "Total bought items",
          count(o.sell_date) as "Total sold items",
          month(install_date) as mo_install,
          count(sell_date)  as count_sell_date
      from  tab_brand b
      left join tab_object o on 
      b.brand_id = o.brand_id and year(o.sell_date) = 2012
      where b.brand_id in (1234, 1324, 1423, 2314)
      group by b.brand_id, month(install_date)
      order by b.brand_id;
      

      【讨论】:

        猜你喜欢
        • 2018-05-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多