SQL查询有错,新手请各位指教。
本帖最后由 u011932802 于 2013-09-03 09:12:38 编辑 我写了一段SQL查询,但是预期的查询效果没有实现。新手菜鸟求教。该怎么写?
SELECT TOP (100) PERCENT NULL AS 林业局, SUBSTRING(单位代码, 5, 2) AS 林场, SUBSTRING(单位代码, 5, 2) AS 单位, (LEN(相关林班号) - LEN(REPLACE(相关林班号, ',',
''))) / LEN(',') + 1 AS 林班数, SUM(管护面积) AS 规划管护面积, SUM(管护面积) AS 实际管护面积, SUM(CASE WHEN 管护方式 = 1 THEN 1 ELSE 0 END)
+ SUM(CASE WHEN 管护方式 = 2 THEN 1 ELSE 0 END) AS 专业管护人数, SUM(CASE WHEN [管护方式] = 1 THEN [管护面积] ELSE 0 END)
+ SUM(CASE WHEN [管护方式] = 2 THEN [管护面积] ELSE 0 END) AS 专业管护面积, SUM(CASE WHEN 管护方式 = 1 THEN 1 ELSE 0 END) AS 设站管护人数,
SUM(CASE WHEN [管护方式] = 1 THEN [管护面积] ELSE 0 END) AS 设站管护面积, SUM(CASE WHEN 管护方式 = 2 THEN 1 ELSE 0 END) AS 责任区人数,
SUM(CASE WHEN [管护方式] = 2 THEN [管护面积] ELSE 0 END) AS 责任区面积, SUM(CASE WHEN 管护方式 = 3 THEN 1 ELSE 0 END) AS 承包管护人数,
SUM(CASE WHEN [管护方式] = 3 THEN [管护面积] ELSE 0 END) AS 承包管护面积, SUM(CASE WHEN 管护方式 = 1 THEN LEN(相关林班号)
- LEN(REPLACE(相关林班号, ',', '')) + 1 ELSE 0 END) AS 设站管护林班数, SUM(CASE WHEN 管护方式 = 2 THEN LEN(相关林班号) - LEN(REPLACE(相关林班号, ',', ''))
+ 1 ELSE 0 END) AS 责任区林班数, SUM(CASE WHEN 管护方式 = 3 THEN LEN(相关林班号) - LEN(REPLACE(相关林班号, ',', '')) + 1 ELSE 0 END) AS 承包管护林班数,
SUM(CASE WHEN 管护方式 = 1 THEN LEN(相关林班号) - LEN(REPLACE(相关林班号, ',', '')) + 1 ELSE 0 END) + SUM(CASE WHEN 管护方式 = 2 THEN LEN(相关林班号)
- LEN(REPLACE(相关林班号, ',', '')) + 1 ELSE 0 END) AS 专业管护林班数, ISNULL(MAX(CASE [管护方式] WHEN '1' THEN [相关林班号] END), '') AS 方式1的代号明细,
ISNULL(MAX(CASE [管护方式] WHEN '2' THEN [相关林班号] END), '') AS 方式2的代号明细, ISNULL(MAX(CASE [管护方式] WHEN '3' THEN [相关林班号] END), '')
AS 方式3的代号明细
FROM dbo.当期管护区信息表
GROUP BY SUBSTRING(单位代码, 5, 2)
运行说相关林班号无效,没有包含在GROUP BY 子句中,可是我只想按照林场分组,不知道能实现不?应该怎么做?不知道说得清楚不,各位能明白不?求热心指导。
[解决办法]
if OBJECT_ID('tempdb..#temp', 'u') is not null drop table #temp;
go
create table #temp( [单位代码] varchar(100), [管护方式] INT, [相关林班号] varchar(100), [面积] INT);
insert #temp
select '120101','2','2','1' union all
select '120102','1','1,3','2' union all
select '120103','3','1,2,4','3' union all
select '120102','1','2,3','4' union all
select '120102','2','1,4','5'
--我计算出来的林班数都是3,楼主仅做个参考吧:
SELECT
林业局, 林场,
方式1林班个数 = MAX(CASE WHEN 管护方式 = 1 THEN 林班数 END),
方式1面积 = SUM(CASE WHEN 管护方式 = 1 THEN [面积] END),
方式2面积 = SUM(CASE WHEN 管护方式 = 2 THEN [面积] END),
方式3面积 = SUM(CASE WHEN 管护方式 = 3 THEN [面积] END),
方式2林班个数 = MAX(CASE WHEN 管护方式 = 2 THEN 林班数 END),
方式3林班个数 = MAX(CASE WHEN 管护方式 = 3 THEN 林班数 END)
from
(
SELECT m.林业局, m.林场, m.[管护方式],m.面积, n.林班数
FROM
(
SELECT
林业局 = SUBSTRING(单位代码, 3, 2),
林场 = SUBSTRING(单位代码, 5, 2),
[管护方式],
林班数 = CONVERT(XML, '<root><v>'+replace(
STUFF((SELECT ','+[相关林班号] FROM #temp b WHERE b.单位代码=a.单位代码 AND b.管护方式=a.管护方式 FOR XML PATH('')),1,1,'')
,',','</v><v>')+'</v></root>'),
面积
FROM #TEMP a
) m
OUTER APPLY
(
SELECT 林班数=COUNT(DISTINCT C.v.value('.','NVARCHAR(MAX)')) FROM m.林班数.nodes('/root/v') C(v)
) n
) T
GROUP BY 林业局, 林场
/*
林业局林场方式1林班个数方式1面积方式2面积方式3面积方式2林班个数方式3林班个数
0101NULLNULL1NULL1NULL
0102365NULL2NULL
0103NULLNULLNULL3NULL3
*/