【问题标题】:Union Statement that can be changed to Case statement可以更改为 Case 语句的 Union 语句
【发布时间】:2013-09-23 00:46:56
【问题描述】:

大家好!

我有这种代码,但它有点难看, 我的一个朋友告诉我,我可以在这里实现案例语句,但我不知道我将如何或如何实现,代码很长,所以如果你能帮助我优化我的代码,我将不胜感激!

PS。请对我温柔,我是 T-sql 的新手 :) 谢谢你!

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

【问题讨论】:

  • COUNT(*) 是一种从表中获取行数的低效方法。指定一列(理想情况下是索引列或主键列),例如:COUNT(PK_Column_Name)

标签: tsql count sql-server-2008-r2 case


【解决方案1】:

假设您的数据有点像这样Sql Fiddle Example,请尝试使用SUM()CASE 对子查询进行此操作。

SELECT SUM(CASE WHEN fld_StorageGroupID  >= 3 and fld_StorageGroupID <= 14 ELSE 0 END) Col1And4,
       SUM(CASE WHEN fld_StorageGroupID = 1 THEN 1 ELSE 0 END)  Col2And5,
       SUM(CASE WHEN fld_StorageGroupID = 2 THEN 1 ELSE 0 END)  Col3And6
FROM #TEMPTABLE1
GROUP BY fld_StorageGroupID

由于您对子查询中的最后 3 列应用相同的过滤器,因此我在这里只完成了前 3 列。

编辑:

我认为这比上面的要好(注意: 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 2017-04-21
    • 1970-01-01
    • 2017-01-16
    • 2018-09-05
    • 2018-12-25
    • 2023-04-07
    • 2016-01-01
    相关资源
    最近更新 更多