我写了这个查询并尝试按“D”分组,但它不起作用。任何帮助?
(select hr_id, max(delivery_dt)as maxd,
(CASE
WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO'
WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
ELSE '> 133 MO' END) D
from INDIVIDUAL_VE_TB
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
Group by hr_id)
我得到了这个结果
HR DATE D
2000001076 4/22/1994 > 133 MO
2000004986 12/13/2004 7 - 78 MO
2000003382 12/13/2003 7 - 78 MO
这是HR的分组,我也试图按D分组,但它不起作用 我把D添加到了小组中 按hr_id分组,D
任何帮助都会很棒!!!
提前谢谢
答案 0 :(得分:3)
你可以尝试:
Select hr_id, max(maxd), D
from
(select hr_id, max(delivery_dt)as maxd,
(CASE
WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO'
WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
ELSE '> 133 MO' END) D
from INDIVIDUAL_VE_TB
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
Group by hr_id)
group by D, hr_id
答案 1 :(得分:1)
处理SQL语句的顺序是关键:
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
EXCEPT
INTERSECT
ORDER BY
请注意,在GROUP BY
之前处理SELECT
。因此,您无法使用SELECT
原因中的别名 - 此时SQL引擎将不会知道它。这也是为什么建议将其移动到FROM
子句中的子选择的其他答案是正确的。如果在FROM
中完成,则在您到达GROUP BY
时就可以使用。
答案 2 :(得分:0)
您必须在组中重复整个案例陈述。你不能使用别名。
如果您使用的是SQL Server,则可以使用WITH子句创建临时命名结果集,并按此组进行分组。
如果没有,您也可以创建一个视图,而不需要按相关列对该视图进行分组和分组。
版本1(复制并粘贴计算列):
select
hr_id,
max(delivery_dt)as maxd,
(CASE
WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO'
WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
ELSE '> 133 MO'
END) D
from
INDIVIDUAL_VE_TB
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
group by
hr_id,
(CASE
WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO'
WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
ELSE '> 133 MO'
END)
版本2(WITH子句):
with temporary(hr_id, maxd, D)
{
select
hr_id,
max(delivery_dt)as maxd,
(CASE
WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO'
WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
ELSE '> 133 MO'
END) D
from
INDIVIDUAL_VE_TB
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
group by
hr_id
}
select
hr_id,
MAX(maxd) maxd,
D
from
temporary
group by
hr_id, D
版本3只是版本2的两部分。
答案 3 :(得分:0)
将其移至连接,以便您拥有可分组的表达式。
select hr_id, max(delivery_dt)as maxd, i.D
from
INDIVIDUAL_VE_TB IV1
join (
select
CASE
IV2._YOUR_PK_HERE_ PK
WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO'
WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
ELSE '> 133 MO' as D
END
from
INVDIVIDUAL_VE_TB IV2
) i on i.PK=IV1.PK
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
Group by hr_id, I.D
答案 4 :(得分:0)
avg
,sum
,max
和count
group by
子句中不允许使用函数,无论其中包含哪些其他函数(在此案例CASE
)。
在GROUP BY
CASE
之后的WHEN
条件中尝试列出您delivery_dt
中使用的字段,在这种情况下为{{1}}。