如何显示聚合中缺少的行?

Bün*_*tik 5 sql-server-2012

我创建了一个视图来显示ValueRange如下:

...
ValueRange=case when Value1>60  and Value1<=65  then '60-65'
                when Value1>65  and Value1<=70  then '65-70'
                when Value1>70  and Value1<=75  then '70-75' END
...
Run Code Online (Sandbox Code Playgroud)

但是我没有Value1>65Value1<=70...的任何数据,所以我看不到结果中的这些行。

我的结果是:

ValueRange   Count
60-65          5
70-75          3
Run Code Online (Sandbox Code Playgroud)

但我的结果应该是:

ValueRange   Count
60-65          5
65-70          0
70-75          3
Run Code Online (Sandbox Code Playgroud)

编辑:正如我之前所说,完整的代码更复杂。实际上这是二维数据透视表,您的答案对我的 sql 无效。所以我发布了所有代码。 WITH RangeTable(YukRange,FiyatRange) AS (SELECT
YukRange=case when Yük<=20000 or Yük IS NULL then '0-20000' when Yük>20000 and Yük<=21000 then '20000-21000' when Yük>21000 and Yük<=22000 then '21000-22000' when Yük>22000 and Yük<=23000 then '22000-23000' when Yük>23000 and Yük<=24000 then '23000-24000' when Yük>24000 and Yük<=25000 then '24000-25000' when Yük>25000 and Yük<=26000 then '25000-26000' when Yük>26000 and Yük<=27000 then '26000-27000' when Yük>27000 and Yük<=28000 then '27000-28000' when Yük>28000 and Yük<=29000 then '28000-29000' when Yük>29000 and Yük<=30000 then '29000-30000' when Yük>30000 and Yük<=31000 then '30000-31000' when Yük>31000 and Yük<=32000 then '31000-32000' when Yük>32000 and Yük<=33000 then '32000-33000' when Yük>33000 and Yük<=34000 then '33000-34000' when Yük>34000 and Yük<=35000 then '34000-35000' when Yük>35000 and Yük<=36000 then '35000-36000' when Yük>36000 and Yük<=37000 then '36000-37000' when Yük>37000 and Yük<=38000 then '37000-38000' when Yük>38000 and Yük<=39000 then '38000-39000' when Yük>39000 and Yük<=40000 then '39000-40000' when Yük>40000 and Yük<=41000 then '40000-41000' END

       , FiyatRange=case when GunlukParams_SGOF<=60 or  GunlukParams_SGOF IS NULL then '0-60' 
                         when GunlukParams_SGOF>60  and GunlukParams_SGOF<=65  then '60-65'
                         when GunlukParams_SGOF>65  and GunlukParams_SGOF<=70  then '65-70'
                         when GunlukParams_SGOF>70  and GunlukParams_SGOF<=75  then '70-75'
                         when GunlukParams_SGOF>75  and GunlukParams_SGOF<=80  then '75-80'
                         when GunlukParams_SGOF>80  and GunlukParams_SGOF<=85  then '80-85'
                         when GunlukParams_SGOF>85  and GunlukParams_SGOF<=90  then '85-90'
                         when GunlukParams_SGOF>90  and GunlukParams_SGOF<=95  then '90-95'
                         when GunlukParams_SGOF>95  and GunlukParams_SGOF<=100 then '95-100'
                         when GunlukParams_SGOF>100 and GunlukParams_SGOF<=105 then '100-105'
                         when GunlukParams_SGOF>105 and GunlukParams_SGOF<=110 then '105-110'
                         when GunlukParams_SGOF>110 and GunlukParams_SGOF<=115 then '110-115'
                         when GunlukParams_SGOF>115 and GunlukParams_SGOF<=120 then '115-120'
                         when GunlukParams_SGOF>120 and GunlukParams_SGOF<=125 then '120-125'
                         when GunlukParams_SGOF>125 and GunlukParams_SGOF<=130 then '125-130'
                         when GunlukParams_SGOF>130 and GunlukParams_SGOF<=135 then '130-135'
                         when GunlukParams_SGOF>135 and GunlukParams_SGOF<=140 then '135-140'
                         when GunlukParams_SGOF>140 and GunlukParams_SGOF<=145 then '140-145'
                         when GunlukParams_SGOF>145 and GunlukParams_SGOF<=150 then '145-150'
                         when GunlukParams_SGOF>150 and GunlukParams_SGOF<=155 then '150-155'
                         when GunlukParams_SGOF>155 and GunlukParams_SGOF<=160 then '155-160'
                         when GunlukParams_SGOF>160 and GunlukParams_SGOF<=165 then '160-165'
                         when GunlukParams_SGOF>165 and GunlukParams_SGOF<=170 then '165-170'
                         when GunlukParams_SGOF>170 and GunlukParams_SGOF<=175 then '170-175'
                         when GunlukParams_SGOF>175 and GunlukParams_SGOF<=180 then '175-180'
                         when GunlukParams_SGOF>180 and GunlukParams_SGOF<=185 then '180-185'
                         when GunlukParams_SGOF>185 and GunlukParams_SGOF<=190 then '185-190'
                         when GunlukParams_SGOF>190 and GunlukParams_SGOF<=195 then '190-195'
                         when GunlukParams_SGOF>195 and GunlukParams_SGOF<=200 then '195-200'
                         when GunlukParams_SGOF>200 and GunlukParams_SGOF<=205 then '200-205'
                         when GunlukParams_SGOF>205 and GunlukParams_SGOF<=210 then '205-210'
                         when GunlukParams_SGOF>210 and GunlukParams_SGOF<=215 then '210-215'
                         when GunlukParams_SGOF>215 and GunlukParams_SGOF<=220 then '215-220'
                         when GunlukParams_SGOF>220 and GunlukParams_SGOF<=225 then '220-225'
                         when GunlukParams_SGOF>225 and GunlukParams_SGOF<=230 then '225-230'
                         when GunlukParams_SGOF>230 and GunlukParams_SGOF<=235 then '230-235'
                         when GunlukParams_SGOF>235 and GunlukParams_SGOF<=240 then '235-240'
                         when GunlukParams_SGOF>240 and GunlukParams_SGOF<=245 then '240-245'
                         when GunlukParams_SGOF>245 and GunlukParams_SGOF<=250 then '245-250'
                         when GunlukParams_SGOF>250 and GunlukParams_SGOF<=255 then '250-255'
                         when GunlukParams_SGOF>255 and GunlukParams_SGOF<=260 then '255-260'
                         when GunlukParams_SGOF>260 and GunlukParams_SGOF<=265 then '260-265'
                         when GunlukParams_SGOF>265 and GunlukParams_SGOF<=270 then '265-270'
                         when GunlukParams_SGOF>270 and GunlukParams_SGOF<=275 then '270-275'
                         when GunlukParams_SGOF>275 and GunlukParams_SGOF<=280 then '275-280'
                         when GunlukParams_SGOF>280 and GunlukParams_SGOF<=285 then '280-285' 
                         when GunlukParams_SGOF>285 and GunlukParams_SGOF<=290 then '285-290' 
                         when GunlukParams_SGOF>290 and GunlukParams_SGOF<=295 then '290-295'
                         when GunlukParams_SGOF>295 and GunlukParams_SGOF<=300 then '295-300'
                         when GunlukParams_SGOF>300                            then '300+'    END
Run Code Online (Sandbox Code Playgroud)

FROM YukFiyat_View), MainTable AS ( SELECT * FROM RangeTable PIVOT( COUNT(YukRange) FOR YukRange IN ([0-20000], [20000-21000], [21000-22000], [22000-23000], [23000-24000], [24000-25000], [25000-26000], [26000-27000] , [27000-28000], [28000-29000], [29000-30000], [30000-31000], [31000-32000], [32000-33000], [33000-34000], [34000-35000] , [35000-36000], [36000-37000], [37000-38000], [38000-39000], [39000-40000], [40000-41000]) ) AS Pvt)

select * from MainTable;

解释:我从YukFiyat_View表中获取值。根据此表中的两个值,我为两个不同的范围创建了临时表。原始表(YukFiyat_View): Date Yük GunlukParams_SGOF 2009-12-30 00:00:00.000 21590 140 2009-12-30 01:00:00.000 20208 100 2009-12-30 02:00:00.000 19313 70 2009-12-30 03:00:00.000 18866 57 2009-12-30 04:00:00.000 18812 57 2009-12-30 05:00:00.000 18974 58 2009-12-30 06:00:00.000 19791 69 2009-12-30 07:00:00.000 20630 69 2009-12-30 08:00:00.000 23314 69 2009-12-30 09:00:00.000 25318 69

我的临时表: Date Yük GunlukParams_SGOF YukRange FiyatRange 2009-12-30 00:00:00.000 21590 140 [21000-22000] [140-145] 2009-12-30 01:00:00.000 20208 100 [20000-21000] [100-105] 2009-12-30 02:00:00.000 19313 70 [0-20000] [70-75] 2009-12-30 03:00:00.000 18866 57 [0-20000] [0-60] 2009-12-30 04:00:00.000 18812 57 [0-20000] [0-60] 2009-12-30 05:00:00.000 18974 58 [0-20000] [0-60] 2009-12-30 06:00:00.000 19791 69 [0-20000] [65-70] 2009-12-30 07:00:00.000 20630 69 [20000-21000] [65-70] 2009-12-30 08:00:00.000 23314 69 [23000-24000] [65-70] 2009-12-30 09:00:00.000 25318 69 [25000-26000] [65-70] 之后,我使用数据透视表创建二维范围表。结果是: FiyatRange [0-20000] [20000-21000] [21000-22000] ... [0-60] 3 0 0 [65-70] 1 1 0 [70-75] 1 0 0 [100-105] 0 1 0 [140-145] 0 0 1 . .

我的问题是: FiyatRange 的某些范围尚未包含在我的表中。因此,我无法看到我创建的所有 FiyatRange 值都没有显示在结果中。所以结果是我想要的: FiyatRange [0-20000] [20000-21000] [21000-22000] ... [0-60] 3 0 0 [60-65] 0 0 0 [65-70] 1 1 0 [70-75] 1 0 0 [75-80] 0 0 0 . . [100-105] 0 1 0 . . [140-145] 0 0 1 . . 所以如果行值都是'0',我想在结果中看到这一行。

Aar*_*and 12

DECLARE @ranges TABLE
(
  Label VARCHAR(20),
  LBound INT,
  UBound INT
);

INSERT @ranges(Label,LBound,UBound)
VALUES(...),
('60-65', 60, 65),
('70-75', 70, 75),
(...);

SELECT ValueRange = r.Label, [Count] = COUNT(o.key)
  FROM @ranges AS r
  LEFT OUTER JOIN dbo.othertable AS o
  ON o.value1 > r.LBound
  AND o.value1 <= r.UBound
  -- AND other filters for dbo.othertable
GROUP BY r.Label;
Run Code Online (Sandbox Code Playgroud)