今天做项目写SQL语句,写了好多,如下:
SELECT t0.DRAI_PIPE_NAME_ROAD, t0.DRAI_PIPE_BROAD_NAME, t0.DRAI_PIPE_EROAD_NAME, t1.w1 + t2.w2 + t3.w3 + t4.w4 AS sumfour, t1.w1, t2.w2, t3.w3,
t4.w4
FROM (SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
FROM sde.TDRAI_PIPE_ST
WHERE (DRAI_PIPE_NAME_ROAD IN
(SELECT DISTINCT DRAI_PIPE_NAME_ROAD
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_1))
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t0 LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w1
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_2
WHERE (DRAI_PIPE_D1 >= 150) AND (DRAI_PIPE_D1 <= 530)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t1 ON t0.DRAI_PIPE_NAME_ROAD = t1.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t1.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t1.DRAI_PIPE_EROAD_NAME LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w2
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_5
WHERE (DRAI_PIPE_D1 >= 600) AND (DRAI_PIPE_D1 <= 1000)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t2 ON t0.DRAI_PIPE_NAME_ROAD = t2.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t2.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t2.DRAI_PIPE_EROAD_NAME LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w3
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_4
WHERE (DRAI_PIPE_D1 >= 1050) AND (DRAI_PIPE_D1 <= 1400)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t3 ON t0.DRAI_PIPE_NAME_ROAD = t3.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t3.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t3.DRAI_PIPE_EROAD_NAME LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w4
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_3
WHERE (DRAI_PIPE_D1 >= 1500)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t4 ON t0.DRAI_PIPE_NAME_ROAD = t4.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t4.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t4.DRAI_PIPE_EROAD_NAME
可是出现这样的情况:求和时有NULL的和值为NULL了!
经过这样的处理:
SELECT t0.DRAI_PIPE_NAME_ROAD, t0.DRAI_PIPE_BROAD_NAME, t0.DRAI_PIPE_EROAD_NAME, CASE WHEN t1.w1 IS NULL
THEN 0.0 ELSE t1.w1 END + CASE WHEN t2.w2 IS NULL THEN 0.0 ELSE t2.w2 END + CASE WHEN t3.w3 IS NULL
THEN 0.0 ELSE t3.w3 END + CASE WHEN t4.w4 IS NULL THEN 0.0 ELSE t4.w4 END AS sumfour, t1.w1, t2.w2, t3.w3, t4.w4
FROM (SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
FROM sde.TDRAI_PIPE_ST
WHERE (DRAI_PIPE_NAME_ROAD IN
(SELECT DISTINCT DRAI_PIPE_NAME_ROAD
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_1))
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t0 LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w1
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_2
WHERE (DRAI_PIPE_D1 >= 150) AND (DRAI_PIPE_D1 <= 530)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t1 ON t0.DRAI_PIPE_NAME_ROAD = t1.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t1.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t1.DRAI_PIPE_EROAD_NAME LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w2
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_5
WHERE (DRAI_PIPE_D1 >= 600) AND (DRAI_PIPE_D1 <= 1000)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t2 ON t0.DRAI_PIPE_NAME_ROAD = t2.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t2.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t2.DRAI_PIPE_EROAD_NAME LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w3
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_4
WHERE (DRAI_PIPE_D1 >= 1050) AND (DRAI_PIPE_D1 <= 1400)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t3 ON t0.DRAI_PIPE_NAME_ROAD = t3.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t3.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t3.DRAI_PIPE_EROAD_NAME LEFT OUTER JOIN
(SELECT TOP (100) PERCENT DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME, SUM(DRAI_PIPE_LENGTH)
AS w4
FROM sde.TDRAI_PIPE_ST AS TDRAI_PIPE_ST_3
WHERE (DRAI_PIPE_D1 >= 1500)
GROUP BY DRAI_PIPE_NAME_ROAD, DRAI_PIPE_BROAD_NAME, DRAI_PIPE_EROAD_NAME
ORDER BY DRAI_PIPE_NAME_ROAD) AS t4 ON t0.DRAI_PIPE_NAME_ROAD = t4.DRAI_PIPE_NAME_ROAD AND
t0.DRAI_PIPE_BROAD_NAME = t4.DRAI_PIPE_BROAD_NAME AND t0.DRAI_PIPE_EROAD_NAME = t4.DRAI_PIPE_EROAD_NAME
这样就可以了!
在网上找来找去找到这样的示例:
记录相加则得到的值为NULL。下面分析以下我下面的SQL语句

2

3

4
