2013-09-18 2 views
0

Добрый день всем!Заявление Союза, которое может быть изменено на заявление о действии

Хорошо, у меня есть такой код, и это нелепо, Мой друг сказал мне, что я могу реализовать Case Statements здесь, но я не знаю, как и как реализовать, код длинный, так что если вы может просто помочь мне оптимизировать мой код, я был бы очень признателен!

PS. пожалуйста, будьте мягкими ко мне, им новые в T-sql :) Спасибо yoU!

SELECT 
     SUM(CYJEWELRY) 'CY_Jewelry' 
     ,SUM(CYAPPLICANCE) 'CY_Appliance' 
     ,SUM(CYCELLPHONE) 'CY_Cellphone' 
     ,SUM(PYJEWELRY) 'PY_Jewelry' 
     ,SUM(PYAPPLIANCE) 'PY_Appliance' 
     ,SUM(PYCELLPHONE) 'PY_Cellphone' 
    FROM 

     ( 

      ---TOTAL NUNG A FORMAT 0,0,0,0,0,0 
      --------------CURRENT YEAR JEWELRY 
      SELECT COUNT (*) AS CYJEWELRY,0 AS CYAPPLICANCE,0 AS CYCELLPHONE,0 AS PYJEWELRY,0 AS PYAPPLIANCE,0 AS PYCELLPHONE 
      FROM #TEMPTABLE1 
      WHERE (fld_StorageGroupID >= 3 and fld_StorageGroupID <= 14) 

     UNION 
      -----------CURRENT YEAR APPLIANCE 

      SELECT 0,COUNT(*),0,0,0,0 
      FROM #TEMPTABLE1 
      WHERE fld_StorageGroupID = 1 

     UNION 
      ------------CURRENT YEAR CELLPHONE 

      SELECT 0,0,COUNT(*),0,0,0 
      FROM #TEMPTABLE1 
      WHERE fld_StorageGroupID = 2 

     UNION 
      ---------------LAST YEAR JEWELRY 
      SELECT 0,0,0,COUNT(*),0,0 
      FROM #TEMPTABLE2 
      WHERE (fld_StorageGroupID >= 3 and fld_StorageGroupID <= 14) 

     UNION 
      -----------------------LAST YEAR APPLIANCE 
      SELECT 0,0,0,0,COUNT (*),0 
      FROM #TEMPTABLE2 
      WHERE fld_StorageGroupID = 1 

     UNION 
      -------------------------LAST YEAR CELLPHONE 
      SELECT 0,0,0,0,0,COUNT(*) 
      FROM #TEMPTABLE2 
      WHERE fld_StorageGroupID = 2 
     )A 
+0

COUNT (*) является неэффективным способом получения количества строк из таблицы. Укажите столбец (в идеале - индексный или первичный ключевой столбец), например: COUNT (PK_Column_Name) – DragonZero

ответ

1

Предполагая, что ваши данные немного, как этот Sql Fiddle Example, попробуйте это для суб запроса с использованием SUM() и CASE.

Поскольку вы применяете тот же фильтр для последних 3 столбцов в подзапросе, я сделал здесь только первые 3 столбца.

EDIT:

Я думаю, что это лучше, чем выше (Примечание:no need to use SUM() in the main query).

Fiddle Example with data

select col1_4 CY_Jewelry, 
     col2_5 CY_Appliance, 
     col3_6 CY_Cellphone, 
     col1_4 PY_Jewelry, 
     col2_5 PY_Appliance, 
     col3_6 PY_Cellphone 
from (
select sum(case when id>= 3 and id <= 14 then 1 else 0 end) col1_4, 
     sum(case when id = 2 then 1 else 0 end) col2_5, 
     sum(case when id = 3 then 1 else 0 end) col3_6 
from t 
--group by id 
) X 
Смежные вопросы