0

このテーブルをクエリする時間は約 8 ~ 12 分であり、2 回クエリを実行すると長すぎるため、テーブルを 1 回クエリしたいと考えています。表には、内部と外部の結果を識別するためのフラグがあります。このフラグが内部である列AとBの合計の合計と、このフラグが外部である列BとCとDの合計が必要です..現在、2つの別々のクエリが結合されています...

これは最初のクエリの例です

Select
CONVERT(varchar(10), right([week_name],10), 111) as DatePeriod --weekly
,[Group] as [Group]
,SUM([columnA]) as [columnA_int]
,SUM([columnB]) as [columnB_int]    
from  myTbl
where internal_external = 'internal' 
group by 
CONVERT(varchar(10), right([week_name],10), 111),[Group]

2 番目のクエリ

Select
CONVERT(varchar(10), right([week_name],10), 111) as DatePeriod --weekly
,[Group] as [Group]
,SUM([columnB]) as [columnB_ext]
,SUM([columnC]) as [columnC_ext]
,SUM([columnC]) as [columnC_ext]        
from  myTbl
where internal_external = 'external' 
group by 
CONVERT(varchar(10), right([week_name],10), 111),[Group]

したがって、理想的には、5 つの列すべてに対して 1 つのクエリを実行し、DB を 1 回だけヒットします。

4

1 に答える 1

3

次のようにしてみてください。

SELECT
    internal_external
    ,CONVERT(varchar(10), right([week_name],10), 111) as DatePeriod --weekly
    ,[Group] as [Group]
    ,SUM(CASE 
            WHEN internal_external='internal' THEN [columnA]
            ELSE 0 
          END) as [columnA_int]
    ,SUM([columnB]) as [columnB_intext] 
    ,SUM(CASE 
            WHEN internal_external='external' THEN [columnC]
            ELSE 0 
          END) as [columnC_ext]
    ,SUM(CASE 
            WHEN internal_external='external' THEN [columnC]
            ELSE 0 
          END) as [columnC_ext2]
FROM  myTbl
GROUP BY
    internal_external
    ,CONVERT(varchar(10), right([week_name],10), 111)
    ,[Group]
-- use the next lines if there are other values for internal_external
HAVING 
    internal_external IN('internal', 'external')

または、 internal_external 列を省略したい場合:

SELECT
    CONVERT(varchar(10), right([week_name],10), 111) as DatePeriod --weekly
    ,[Group] as [Group]
    ,SUM(CASE 
            WHEN internal_external='internal' THEN [columnA]
            ELSE 0 
          END) as [columnA_int]
    ,SUM(CASE 
            WHEN internal_external='internal' THEN [columnB]
            ELSE 0 
          END) as [columnB_int]
    ,SUM(CASE 
            WHEN internal_external='external' THEN [columnB]
            ELSE 0 
          END) as [columnB_ext]
    ,SUM(CASE 
            WHEN internal_external='external' THEN [columnC]
            ELSE 0 
          END) as [columnC_ext]
FROM  myTbl
GROUP BY
    internal_external
    ,CONVERT(varchar(10), right([week_name],10), 111)
    ,[Group]
-- use the next lines if there are other values for internal_external
HAVING 
    internal_external IN('internal', 'external')
于 2012-04-10T16:26:00.153 に答える