用SQL查询不同价位商品的售出数量

悬崖跳舞被人砍 2014-11-10 10:17:06
我有一表如下:
商品名 商品编码 商品价格 售出数量
饺子 01 8 2
馒头 02 2 6
拖把 03 89 1
茶杯 04 25 4
饺子 05 8 2
我想把商品价格分为0-10、10-20、20-30、40-50···90-100来查询不同价位的商品的售出数量。请问有没有语句可以得到如此的查询结果?
...全文
433 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-11-11
  • 打赏
  • 举报
回复
换一下形式而已
    SELECT '['+Convert(varchar(11),n.g*10)+'-'+Convert(varchar(11),n.g*10+10)+']' AS 价位,
s.总售出数量
FROM (
SELECT number AS g
FROM master..spt_values
WHERE type = 'p'
AND number < 10
) n
LEFT JOIN (
SELECT 商品价格/10 AS g,
SUM(售出数量) AS 总售出数量
FROM table1
GROUP BY 商品价格/10
) s
ON s.g = n.g
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
WITH table1(商品价格,售出数量) AS (
    SELECT 8,2 UNION ALL
    SELECT 2,6 UNION ALL
    SELECT 89,1 UNION ALL
    SELECT 25,4 UNION ALL
    SELECT 8,2
)
,s AS (
    SELECT 商品价格/10 AS g,
           SUM(售出数量) AS 总售出数量
      FROM table1
     GROUP BY 商品价格/10
)
,n AS (
    SELECT number AS g
      FROM master..spt_values
     WHERE type = 'p'
       AND number < 10
)
    SELECT '['+Convert(varchar(11),n.g*10)+'-'+Convert(varchar(11),n.g*10+10)+']' AS 价位,
           s.总售出数量
      FROM n
 LEFT JOIN s
        ON s.g = n.g
价位                       总售出数量
------------------------- -----------
[0-10]                             10
[10-20]                          NULL
[20-30]                             4
[30-40]                          NULL
[40-50]                          NULL
[50-60]                          NULL
[60-70]                          NULL
[70-80]                          NULL
[80-90]                             1
[90-100]                         NULL
我用的是SQL Server2000,是不是这个版本的SQL不支持with as的,而且我想通过申明表变量的方式来代替with as 也不可以。
Tiger_Zhao 2014-11-10
  • 打赏
  • 举报
回复
WITH table1(商品价格,售出数量) AS (
SELECT 8,2 UNION ALL
SELECT 2,6 UNION ALL
SELECT 89,1 UNION ALL
SELECT 25,4 UNION ALL
SELECT 8,2
)
,s AS (
SELECT 商品价格/10 AS g,
SUM(售出数量) AS 总售出数量
FROM table1
GROUP BY 商品价格/10
)
,n AS (
SELECT number AS g
FROM master..spt_values
WHERE type = 'p'
AND number < 10
)
SELECT '['+Convert(varchar(11),n.g*10)+'-'+Convert(varchar(11),n.g*10+10)+']' AS 价位,
s.总售出数量
FROM n
LEFT JOIN s
ON s.g = n.g

价位                       总售出数量
------------------------- -----------
[0-10] 10
[10-20] NULL
[20-30] 4
[30-40] NULL
[40-50] NULL
[50-60] NULL
[60-70] NULL
[70-80] NULL
[80-90] 1
[90-100] NULL
还在加载中灬 2014-11-10
  • 打赏
  • 举报
回复
SELECT 商品编码,商品名
	,SUM(CASE WHEN 商品价格<=10 THEN 售出数量 ELSE 0 END)[0-10]
	,SUM(CASE WHEN 商品价格<=20 AND 商品价格>10 THEN 售出数量 ELSE 0 END)[10-20]
	,SUM(CASE WHEN 商品价格<=30 AND 商品价格>20 THEN 售出数量 ELSE 0 END)[20-30]
	,SUM(CASE WHEN 商品价格<=40 AND 商品价格>30 THEN 售出数量 ELSE 0 END)[30-40]
	,SUM(CASE WHEN 商品价格<=50 AND 商品价格>40 THEN 售出数量 ELSE 0 END)[40-50]
	,SUM(CASE WHEN 商品价格<=60 AND 商品价格>50 THEN 售出数量 ELSE 0 END)[50-60]
	,SUM(CASE WHEN 商品价格<=70 AND 商品价格>60 THEN 售出数量 ELSE 0 END)[60-70]
	,SUM(CASE WHEN 商品价格<=80 AND 商品价格>70 THEN 售出数量 ELSE 0 END)[70-80]
	,SUM(CASE WHEN 商品价格<=90 AND 商品价格>80 THEN 售出数量 ELSE 0 END)[80-90]
	,SUM(CASE WHEN 商品价格<=100 AND 商品价格>90 THEN 售出数量 ELSE 0 END)[90-100]
FROM
	TB
GROUP BY 商品编码,商品名
chen357313771 2014-11-10
  • 打赏
  • 举报
回复
DECLARE @StartAmt INT,@EndAmt INT
SELECT @StartAmt=0,@EndAmt=10

SELECT CAST(@StartAmt AS VARCHAR)+'-'+CAST(@EndAmt AS VARCHAR) AS [价位]
	,SUM(售出数量) [售出数量] 
FROM t
WHERE t.商品价格 BETWEEN @StartAmt AND @EndAmt
--小F-- 2014-11-10
  • 打赏
  • 举报
回复
因为只有10个等级 直接写静态的效率高一些。剩下的自己去补充下吧。
--小F-- 2014-11-10
  • 打赏
  • 举报
回复
select
   商品名,
   sum(case when 商品价格 between 0 and 10 then 售出数量 else 0 end) ,
..........
from
   tb
group by
   商品名

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧