我创建了一个视图来显示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>65
和Value1<=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)