日期:2014-05-17  浏览次数:20536 次

sql行转列的统计问题
本帖最后由 lala133 于 2013-08-09 11:58:48 编辑
我这有一个表SJZL_ERP_MD_GRMRYJMX
ssmd是店名,mddm是店代码,两个是一致的表示一家店,店名和点代码是唯一的,zyj总业绩就是我要统计的。如果写统计语句,统计成下面图片那样

这是统计一个月的,行是店名,列是每个月的号数、合计,第一周的统计,第二周的统计、第三周的统计、第4天的统计、最高业绩、最低业绩、超三天的超千元的统计。


大家帮帮忙,给个思路或者给个sql语句。我是新手,写这个统计有很多的困难。
求相助
请思路
SQL 统计

------解决方案--------------------
以下是行列转换的方法,你可以参考一下,另外你周统计的那些可以单独查,再UNION ALL组合到之前的表。没必要一步到位。另外你得说清楚你的周是怎么划分的,前7天算一周?那么第五周只有2天的那种怎么考虑你要说清楚。

--PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P
--
--完整语法:
--table_source
--PIVOT(
--聚合函数(value_column)
--FOR pivot_column
--IN(<column_list>)
--)

--eg.
--静态SQL(要求已知列名)
DECLARE @TB TABLE(ID INT ,VALUE1 NVARCHAR(50),VALUE2 NVARCHAR(50))
INSERT INTO @TB
SELECT 1,'A','S1' UNION ALL
SELECT 1,'B','S2' UNION ALL
SELECT 1,'C','S3' UNION ALL
SELECT 2,'A','S1' UNION ALL
SELECT 2,'B','S2' UNION ALL
SELECT 2,'C','S3'

SELECT * FROM (SELECT * FROM @TB) A 
PIVOT (
MAX(VALUE2) FOR VALUE1 IN (A,B,C)--但这里写死了列名
) B

--eg.2
--动态SQL(由于用到字符串,因此表变量无法使用,改用临时表)
--DROP TABLE #TB

SELECT * INTO #TB FROM (
SELECT 1 id,'A' Value1,'S1' Value2 UNION ALL
SELECT 1,'B','S2' UNION ALL
SELECT 1,'C','S3' UNION ALL
SELECT 2,'A','S1' UNION ALL
SELECT 2,'B','S2' UNION ALL
SELECT 2,'C','S3')A

DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = ISNULL(@SQL + '],[' , '') + Value1 from #TB GROUP BY Value1
SET @SQL = '[' + @SQL + ']'

EXEC ('SELECT * FROM (SELECT * FROM #TB) D PIVOT (MAX(VALUE2) FOR VALUE1 IN ('+@SQL+')) B')

------解决方案--------------------
--楼主没给 每日销售表?
--假如每日销售表就是图片中的上半部分的话,那么下半部分的统计参考如下:
SELECT 
[第一周] = SUM(CASE WHEN DAY(日期) BETWEEN 1 AND 7 THEN 销售金额 END),
[第二周] = SUM(CASE WHEN DAY(日期) BETWEEN 8 AND 14 THEN 销售金额 END),
[第三周] = SUM(CASE WHEN DAY(日期) BETWEEN 15 AND 21 THEN 销售金额 END),
[第四周] = SUM(CASE WHEN DAY(日期) BETWEEN 22 AND 28 THEN 销售金额 END),
[第五周] = SUM(CASE WHEN DAY(日期) BETWEEN 29 AND 31 THEN 销售金额 END),
[最高业绩] = MAX(销售金额),
[最低业绩] = ISNULL(MIN(销售金额), 0),
[超3千天数]&