[英]Temporary column, count and Case statement
我是SQL Server的新手,试图在这里学习这些知识。 我目前正在使用SQL Server Management Studio v17.9
我有两个表Product
和Receipt
,其中有一个共同的列( ProductID
)。
我需要创建一个查询,以显示产品已售出多少次,并创建一个带有调味文字的临时列。
像这样:
ID Name Times Sold Movement
----------- -------------------- ------------- -------------
1 Smart TV LED 42p 1 Little Movement
27 Teatro en Casa 2 Few Movement
37 smartphone AG 0 No Movement
47 refrigerador 4 Normal Movement
我想出了这个
SELECT
p.Idprod 'ID',
p.name 'Product Name',
COUNT(df.idprod) 'Times Sold',
Movement = (CASE
WHEN 'Times Sold' = 0 THEN 'No Movement'
WHEN 'Times Sold' = 1 THEN 'Little Movement'
WHEN 'Times Sold' = 2 THEN 'Few Movement'
WHEN 'Times Sold' = 3 THEN 'Few Movement'
ELSE 'Normal Movement'
END)
FROM
product p
FULL JOIN
DetailsReciepts df ON p.IdProd = df.idProd
GROUP BY
p.IdProd, p.name
这会吐出错误消息:
将varchar值“已售时间”转换为数据类型int时转换失败
我尝试了Convert()
,设置了诸如@SoldTimes
和@Movement
类的临时语句,最后尝试了IF
,但是没有运气。 试图搜索网络,我被困住了。
您无法在查询中引用计算出的“已售时间”列。 您将需要创建另一个已计算“已售出时间”的表,可能是CTE,临时表或派生表。
在不了解表的情况下,您可以尝试使用CTE:
;with timesSold as (
select
p.Idprod 'ID',
p.name 'Product Name',
COUNT(df.idprod) 'Times Sold'
from
product p FULL JOIN DetailsReciepts df
on p.IdProd = df.idProd
group by
p.IdProd,
p.name
)
select ts.*
, 'Movement' =
(case
when Times Sold=0 then 'No Movement'
when Times Sold=1 then 'Little Movement'
when Times Sold=2 then 'Few Movement'
when Times Sold=3 then 'Few Movement'
else 'Normal Movement' end)
from
timesSold ts
有关您得到的错误的更多特定信息,“ Times Sold”只是一个字符串文字。 它没有引用您要计算的列Times Times Sold。 因此,当您要求case语句比较“售出的时间”是否等于一个数字时,它会尝试将“售出的时间”转换为整数,从而失败。
您误解了这段代码在做什么:
when 'Times Sold'=3 then 'Few Movement'
您没有将COUNT(df.idprod)
的值与数字进行比较。 您正在将文字字符串'Times Sold'
与数字进行比较。
如果省去了case
块内的别名,则可以使用。
select
p.Idprod 'ID',
p.name 'Product Name',
COUNT(df.idprod) 'Times Sold',
(case
when COUNT(df.idprod)=0 then 'No Movement'
when COUNT(df.idprod)=1 then 'Little Movement'
when COUNT(df.idprod)=2 then 'Few Movement'
when COUNT(df.idprod)=3 then 'Few Movement'
else 'Normal Movement'
end ) Movement
from
product p FULL JOIN DetailsReciepts df
on p.IdProd = df.idProd
group by
p.IdProd,
p.name
您可以为查询结果值分配别名,但不能在同一查询中使用该别名。 但是,您可以在外部查询中使用别名。
这也将起作用,并且可能更可取:
select
subquery.ID,
subquery.[Product Name],
subquery.[Times Sold],
(case
when subquery.[Times Sold]=0 then 'No Movement'
when subquery.[Times Sold]=1 then 'Little Movement'
when subquery.[Times Sold]=2 then 'Few Movement'
when subquery.[Times Sold]=3 then 'Few Movement'
else 'Normal Movement'
end ) Movement
from (
select
p.Idprod 'ID',
p.name 'Product Name',
COUNT(df.idprod) 'Times Sold'
from
product p FULL JOIN DetailsReciepts df
on p.IdProd = df.idProd
group by
p.IdProd, p.Name
) subquery
这是您似乎想要的查询:
select p.Idprod as id, p.name as Product_Name,
count(df.idProd) as num_sold,
(case when count(df.idProd) = 0 then 'No Movement'
when count(df.idProd) = 1 then 'Little Movement'
when count(df.idProd) <= 3 then 'Few Movement'
else 'Normal Movement'
end) as movement
from product p left join
DetailsReciepts df
on p.IdProd = df.idProd
group by p.IdProd, p.name;
笔记:
full join
几乎是不合适的。 您需要所有产品,因此它应该是from
的第一个表。 然后使用left join
。 as
和=
。 <alias> =
是SQL Server扩展; 与我建议至少开始as
所有作业。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.