2017-07-09 8 views
0

Joeは世界中のDVDレンタルストアを所有しています。彼は世界中のさまざまな地域に店舗を持っています。毎月、彼は店内の機器が最新であるかどうかを確認するのが好きです。在庫の割合を「現在」、「ニーズの更新」、および「必須」の各地域で特定します。これは、彼の顧客が自分の店で最高の経験を持つことを保証するのに役立ちます。複数のサブカテゴリを持つカテゴリ内の加重平均の取得

助手Billは、各地域の機器の割合とステータスをJoeに示すSQLクエリを作成したいと考えています。彼の前の男はこれを行うためにExcelを使いましたが、BillはSQLとSSRSレポートを見て、Joeが見たいと思っている地域を選ぶことができます。彼は、報告書の年が進むにつれて、それを数ヶ月から四半期に動的に移行させたいと考えています。これは、ビルがこれまでに思い付くことができていたものです:

with 
COUNTS as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,cnts.[Region] 
from TABLEIMPORT cnts 
group by cnts.[Month], cnts.[Equipment Status], cnts.[Region] 

), 

TOT as (
select distinct 
count(distinct tot.[Asset ID]) [Equipmnet Total] 
,tot.[Month] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(tot.[Month]) [Year] 
from TABLEIMPORT tot 
group by tot.[Month] 
), 

DATA as (
select 
c.[Month] 
,c.[Equipment Counts]/cast(t.[Equipment Total] as decimal (18,2)) [Percents] 
,c.[Equipment Status] 
,c.Quarter 
,c.Year 
,c.[Region] 
from counts c 
    inner join TOT t on t.[Month] = c.[Month] 
    ), 

QUARTERS as (
select distinct 
d.Quarter [Month] 
,avg(d.Percents) [Percents] 
,d.[Equipment Status] 
,d.Quarter 
,d.Year 
from data d 
group by d.[Equipment Status], d.Quarter, d.Year 
), 

OWN as (
select distinct 
o.[Region] 
,case 
    when o.[Region] in ('Northeast', 
           'Southeast', 
           'Midwest', 
           'Northwest', 
           'Southwest', 
           'Mexico', 
           'Canada',) 
     then 'North America' 
    when o.[Region] like 'Europe' 
     then 'Europe' 
    when o.[Region] like 'Africa' 
     then 'Africa' 
    when o.[Region] like 'Asia' 
     then 'Asia' 
    when o.[Region] like 'Australia' 
     then 'Australia' 
    else isnull(o.[Region], 'No Region') 
    end [SelectRegion] 

    from TABLEIMPORT o 

), 

QTRMNTH as (
select distinct 
q.Quarter [Month] 
,q.Percents [Percents] 
,d.[Equipment Status] 
,d.Quarter 
,d.Year 
,o.SelectRegion 
from data d 
    inner join OWN o on o.[Region] = d.[Region] 
    inner join QUARTERS q on q.Quarter = d.Quarter and q.year = d.Year and q.[Equipment Status] = d.[Equipment Status] 
where d.[Month] < DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) - 1, -1) and d.[Month] > dateadd(MONTH,-12,GETDATE()) 


UNION 

select distinct 
convert(varchar(3),datename(month, d.[Month])) [Month] 
,d.Percents [Percents] 
,d.[Equipment Status] 
,d.Quarter 
,d.Year 
,o.SelectRegion 
from data d 
     inner join OWN o on o.[Region] = d.[Region] 

where d.[Month] > DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) - 1, -1) and d.Year = year(getdate()) 
) 

select * 
from QTRMNTH 
--where QTRMNTH.SelectOrg in (@SelectOrg) 

は以前からExcelにそれを比較すると、すべてが正しく、彼のSSRSはすべて、わずかにあるのパーセンテージを持っている北米を除く完璧に取り組んでいますオフ。彼は、北アメリカの小地域の加重平均が、一部の小地域が他の地域よりも大きいため、これを修正して正しい割合を得ると考えている。

北米の各地域の加重平均を計算するにはどうすればよいですか?

EDIT:

異なる領域を抜け出し

with 
OWN as (
select distinct 
o.[Region] 
,case 
    when o.[Region] in ('Northeast', 'Southeast', 'Midwest', 'Southwest', 
          'Mexico', 'Canada',) 
    then 'North America' 
when o.[Region] like 'Europe' 
    then 'Europe' 
when o.[Region] like 'Africa' 
    then 'Africa' 
when o.[Region] like 'Asia' 
    then 'Asia' 
when o.[Region] like 'Australia' 
    then 'Australia' 
else isnull(o.[Region], 'No Region') 
end [SelectRegion] 

from TABLEIMPORT o 
), 

COUNTS as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Area] = cnts.[Region] 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 

), 

COUNTNE as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.[Region] like '%Northeast%' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTSE as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.[Region] like '%Southeast%' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTMW as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.[Region] like '%Midwest%' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNSW as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.[Region] like '%Southwest%' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTNw as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.[Region] like '%Northwest%' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTMX as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.[Region] like '%Mexico%' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTCN as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.[Region] like '%Canada%' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTEU as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.SelectRegion like 'Europe' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTAS as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.SelectRegion like 'Asia' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTAF as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
     inner join OWN o on o.[Region] = cnts.[Region] 
where o.SelectRegion like 'Africa' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

COUNTaus as (
select distinct 
count(distinct cnts.[Asset ID]) [Equipment Counts] 
,cnts.[Month] 
,cnts.[Equipment Status] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(cnts.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT cnts 
    inner join OWN o on o.[Region] = cnts.[Region] 
where o.SelectRegion like 'Australia' 
group by cnts.[Month], cnts.[Equipment Status], o.[Region] 
), 

TOT as (
select distinct 
count(distinct tot.[Asset ID]) [Equipment Total] 
,tot.[Month] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(tot.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT tot 
    inner join OWN o on o.[Region] = tot.[Region] 
group by tot.[Month], o.[Region] 
), 

TOTNA as (
select distinct 
count(distinct tot.[Asset ID]) [Equipment Total] 
,tot.[Month] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(tot.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT tot 
    inner join OWN o on o.[Region] = tot.[Region] 
where o.SelectRegion like 'North America' 
group by tot.[Month], o.[Region] 
), 

TOTEU as (
select distinct 
count(distinct tot.[Asset ID]) [Equipment Total] 
,tot.[Month] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(tot.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT tot 
    inner join OWN o on o.[Region] = tot.[Region] 
where o.SelectRegion like 'Europe' 
group by tot.[Month], o.[Region] 
), 

TOTAS as (
select distinct 
count(distinct tot.[Asset ID]) [Equipment Total] 
,tot.[Month] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(tot.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT tot 
    inner join OWN o on o.[Region] = tot.[Region] 
where o.SelectRegion like 'Asia' 
group by tot.[Month], o.[Region] 
), 

TOTAF as (
select distinct 
count(distinct tot.[Asset ID]) [Equipment Total] 
,tot.[Month] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(tot.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT tot 
    inner join OWN o on o.[Region] = tot.[Region] 
where o.SelectRegion like 'Africa' 
group by tot.[Month], o.[Region] 
), 

TOTAUS as (
select distinct 
count(distinct tot.[Asset ID]) [Equipment Total] 
,tot.[Month] 
,'Q' + convert(varchar(20),datepart(qq,[Month])) [Quarter] 
,year(tot.[Month]) [Year] 
,o.[Region] 
from TABLEIMPORT tot 
    inner join OWN o on o.[Region] = tot.[Region] 
where o.SelectRegion like 'Australia' 
group by tot.[Month], o.[Region] 
), 

DATANE as (
select distinct 
cne.[Month] 
,cne.[Equipment Counts]/cast(T.[Equipment Total] as decimal (18,2)) [Percents] 
,cne.[Equipment Status] 
,cne.Quarter 
,cne.Year 
,cne.[Region] 
from COUNTNE cne 
    inner join TOTNA t on t.[Month] = cne.[Month] 
), 

DATASE as (
select distinct 
cse.[Month] 
,cse.[Equipment Counts]/cast(T.[Equipment Total] as decimal (18,2)) [Percents] 
,cse.[Equipment Status] 
,cse.Quarter 
,cse.Year 
,cse.[Region] 
from COUNTSE cse 
    inner join TOTNA t on t.[Month] = cse.[Month] 
), 

DATAMW as (
select distinct 
cmw.[Month] 
,cmw.[Equipment Counts]/cast(T.[Equipment Total] as decimal (18,2)) [Percents] 
,cmw.[Equipment Status] 
,cmw.Quarter 
,cmw.Year 
,cmw.[Region] 
from COUNTMW cmw 
    inner join TOTNA t on t.[Month] = cmw.[Month] 
), 

DATASW as (
select distinct 
csw.[Month] 
,csw.[Equipment Counts]/cast(T.[Equipment Total] as decimal (18,2)) [Percents] 
,csw.[Equipment Status] 
,csw.Quarter 
,csw.Year 
,csw.[Region] 
from COUNTSW csw 
    inner join TOTNA t on t.[Month] = csw.[Month] 
), 

DATANW as (
select distinct 
cnw.[Month] 
,cnw.[Equipment Counts]/cast(T.[Equipment Total] as decimal (18,2)) [Percents] 
,cnw.[Equipment Status] 
,cnw.Quarter 
,cnw.Year 
,cnw.[Region] 
from COUNTNW cnw 
    inner join TOTNA t on t.[Month] = cnw.[Month] 
), 

DATAMX as (
select distinct 
cmx.[Month] 
,cmx.[Equipment Counts]/cast(T.[Equipment Total] as decimal (18,2)) [Percents] 
,cmx.[Equipment Status] 
,cmx.Quarter 
,cmx.Year 
,cmx.[Region] 
from COUNTMX cmx 
    inner join TOTna t on t.[Month] = cmx.[Month] 
), 

DATACN as (
select distinct 
ccn.[Month] 
,ccn.[Equipment Counts]/cast(T.[Equipment Total] as decimal (18,2)) [Percents] 
,ccn.[Equipment Status] 
,ccn.Quarter 
,ccn.Year 
,ccn.[Region] 
from COUNTCN ccn 
    inner join TOTna t on t.[Month] = ccn.[Month] 
), 

DATAEU as (
select distinct 
ceu.[Month] 
,ceu.[Equipment Counts]/cast(t.[Equipment Total] as decimal (18,2)) [Percents] 
,ceu.[Equipment Status] 
,ceu.Quarter 
,ceu.Year 
,ceu.[Region] 
from COUNTEU ceu 
    inner join TOTEU t on t.[Month] = ceu.[Month] 
), 

DATAAS as (
select distinct 
cas.[Month] 
,cas.[Equipment Counts]/cast(t.[Equipment Total] as decimal (18,2)) [Percents] 
,cas.[Equipment Status] 
,cas.Quarter 
,cas.Year 
,cas.[Region] 
from COUNTAS cas 
    inner join TOTAS t on t.[Month] = cas.[Month] 
), 

DATAAF as (
select distinct 
caf.[Month] 
,caf.[Equipment Counts]/cast(t.[Equipment Total] as decimal (18,2)) [Percents] 
,caf.[Equipment Status] 
,caf.Quarter 
,caf.Year 
,caf.[Region] 
from COUNTAF caf 
    inner join TOTAF t on t.[Month] = caf.[Month] 
), 

DATAAUS as (
select distinct 
caus.[Month] 
,caus.[Equipment Counts]/cast(t.[Equipment Total] as decimal (18,2)) [Percents] 
,caus.[Equipment Status] 
,caus.Quarter 
,caus.Year 
,caus.[Region] 
from COUNTAUS caus 
     inner join TOTAUS t on t.[Month] = caus.[Month] 
), 

DATA as (
select * 
from DATANE dne 

UNION 

select * 
from DATAse dse 

UNION 

select * 
from DATAmw dmw 

UNION 

select * 
from DATAsw dsw 

UNION 

select * 
from DATAnw dnw 

UNION 

select * 
from DATAcn dcn 

UNION 

select * 
from DATAmx dmx 

UNION 

select * 
from DATAeu deu 

UNION 

select * 
from DATAas das 

UNION 

select * 
from DATAaf daf 

UNION 

select * 
from DATAaus daus 
), 

QUARTERS as (
select distinct 
d.Quarter [Month] 
,avg(d.Percents) [Percents] 
,d.[Equipment Status] 
,d.Quarter 
,d.Year 
from data d 
group by d.[Equipment Status], d.Quarter, d.Year 
), 

QTRMNTH as (
select distinct 
q.Quarter [Month] 
,q.Percents [Percents] 
,d.[Equipment Status] 
,d.Quarter 
,d.Year 
,o.SelectRegion 
from data d 
    inner join OWN o on o.[Region] = d.[Region] 
    inner join QUARTERS q on q.Quarter = d.Quarter and q.year = d.Year and q.[Equipment Status] = d.[Equipment Status] 
where d.[Month] < DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) - 1, -1) and d.[Month] > dateadd(MONTH,-12,GETDATE()) 

UNION 

select distinct 
convert(varchar(3),datename(month, d.[Month])) [Month] 
,d.Percents [Percents] 
,d.[Equipment Status] 
,d.Quarter 
,d.Year 
,o.SelectRegion 
from data d 
    inner join OWN o on o.[Region] = d.[Region] 

where d.[Month] > DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) - 1, -1) and d.Year = year(getdate()) 
) 

select * 
from QTRMNTH 
+1

あなたはこれを修復して宿題に見えませんでしたか?ビルは問題を解決するために何をしようとしましたか?その試行されたクエリはどこですか? –

+0

投稿を追加しました – programr

+0

@programrテーブルのスキーマを投稿できますか?サンプルデータセットと結果? –

答えて

0

このクエリは、小さな犬の朝食のように見えます。 主な問題:既に値が異なっているよう

  1. SELECT DISTINCTGROUP BYクエリで必要とされません。 TABLEIMPORTのデータが正規化されていない場合はDISTINCTの使用がCOUNTSTOTのクエリでわかります。
  2. クエリの意図を説明するコメントがたくさんあります。
  3. 変数/エイリアスの名前が非常に貧弱です。

私は、最初のクエリに問題がここにある疑いがある:

QTRMNTH as (
select distinct 
q.Quarter [Month] 
,q.Percents [Percents] 
,d.[Equipment Status] 
,d.Quarter 
,d.Year 
,o.SelectRegion 
from data d 
    inner join OWN o on o.[Region] = d.[Region] 
    inner join QUARTERS q on q.Quarter = d.Quarter and q.year = d.Year and q.[Equipment Status] = d.[Equipment Status] 
where d.[Month] < DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) - 1, -1) and d.[Month] > dateadd(MONTH,-12,GETDATE()) 

私は上記のコードは、月次データ(data)に基づいて「大きい領域」[SelectRegion]あたりの四半期ごとの結果を返すことになっていると仮定します。この場合、DISTINCTを削除し、GROUP BYを追加する必要があります。

他のすべてのクエリからDISTINCTを削除して、他の隠された問題を見つけることもできると便利だと思います。

関連する問題