SQL 销售统计对比

这2天一直在做一个销售统计对比模块;

先描述下:A表里记录了各个店铺的信息、B表里是销售记录的信息(与A表code对应);

本来就一个简单的查询语句,问题就出在查询的时候要根据不同时间段来查询 - -

也就是说传入三个时间段分别为:本月、上一个月、去年同期;要根据这三个时间段来查询他当时的销售数量、实售金额、单价,按说也不难可是对于同一张表里分时间段来查询的话我相信不细心的朋友都会迷茫。。。

我也 是迷茫了几天才弄出来,现在贴上来做个记号 以后再用到也方便了;废话不说了上代码:

这个查询语句有点复杂又点长耐心点。。。

代码
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
--
Author: <宋朋飞 >
--
Create date: <Create Date,2010-12-13 10:49:08,>
--
Description: <Description,各店铺销售明细对比,>
--
=============================================
ALTER PROCEDURE [dbo].[select_SellContrast]
@BLY DATETIME , --lastyear 去年开始时间
@ELY DATETIME , --去年结束日期
@BLM DATETIME , --上月开始时间
@ELM DATETIME , --上月结束时间
@beginNow DATETIME , --当前开始时间
@endNow DATETIME , --当前结束时间
@Class VARCHAR(50) --标识当前?种类的销售明细对比

AS
BEGIN
SELECT (SELECT c_short FROM xt_company WHERE c_comcode=c.c_com) AS '店别'
,a.c_number
AS '同期数量'
,b.c_number
AS '上次'
,c.c_number
AS '本次'
,c.c_number
-a.c_number AS '同比'
,c.c_number
-b.c_number AS '环比'
,
convert(decimal(20,2),a.c_price) as '同期实售'
,
convert(decimal(20,2),b.c_price) as '上次'
,
convert(decimal(20,2),c.c_price) as '本次'
,
convert(decimal(20,2),c.c_price-a.c_price) AS '同比'
,
convert(decimal(20,2),c.c_price-b.c_price) AS '环比'
,
convert(decimal(20,2),a.c_price/a.c_number) as '同期单价'
,
convert(decimal(20,2),b.c_price/b.c_number) as '上次'
,
convert(decimal(20,2),c.c_price/c.c_number) as '本次'
,
convert(decimal(20,2),c.c_price-a.c_price) AS '同比'
,
convert(decimal(20,2),c.c_price-b.c_price) AS '环比'
,
convert(decimal(10,1),(c.c_price/c.c_zprice)*10) as '折扣'
FROM --去年同期
(SELECT c_com, SUM(c_number)AS'c_number',sum(c_price*c_number) AS 'c_price' FROM ls_retail
WHERE c_arttypecode=@Class and c_date BETWEEN @BLY AND @ELY
group by c_com) a
INNER JOIN --上月
(SELECT c_com,SUM(c_number)AS'c_number',sum(c_price*c_number) AS 'c_price' FROM ls_retail
WHERE c_arttypecode=@Class and c_date BETWEEN @BLM AND @ELM
group by c_com) b ON b.c_com=a.c_com
INNER JOIN --当前
(SELECT c_com,SUM(c_number)AS'c_number',sum(c_price*c_number) AS 'c_price',sum(c_zprice)as 'c_zprice' FROM ls_retail
WHERE c_arttypecode=@Class and c_arttypecode!=07&08&09 and c_date BETWEEN @beginNow AND @endNow
GROUP BY c_com) c ON c.c_com=a.c_com
GROUP BY c.c_com,a.c_number,b.c_number,c.c_number,a.c_price,b.c_price,c.c_price,c.c_zprice
--GROUP BY 必须加上去否则会提示你错误
ORDER BY c.c_com
END

看着挺复杂,其实静下心来看看也就那么回事,这东西得有耐心。。。。

原文地址:https://www.cnblogs.com/song_/p/1906948.html