按天分组值

时间:2014-04-04 09:27:09

标签: sql oracle oracle11g group-by pivot

我使用的是Oracle 11g, Plsql版本10.0.1

我获取了Product_Status的每日报告。一旦原始数据到来。我从原始数据中转出一个轴,并按产品销售按日期列在MS Excel中对其进行分组。我想在查询本身做同样的事情。

产品销售日期格式:3/12/2014 7:57:27 AM Tbl_Name :tv_productdetails

普通的Sql查询

以下是产品详细信息的示例查询:

Select product.id, Product_Sales_Date
from smspadm.tv_productdetails
where 
Product_Sales_Date >= TO_DATE('01-april-2014','DD-MON-YYYY')
and Product_Sales_Date < TO_DATE('04-april-2014','DD-MON-YYYY')
and product_status in('active')

预期输出为:

product.id 1-Apr 2-Apr 3-Apr 4-Apr Grandtotal

A011          89     89   89    89  356
B055          85     85   85    85  340
C055          78     78   78    78  312
D011          98     98   98    98  392
E897          45     45   45    45  180

我只需要两列Product.id,Product_Sales_Date按销售日期对数据进行分组。 以下是样本数据:

Product.id  Product_Sales_Date

A001    4/12/2014 3:38:00 PM
A002    4/13/2014 3:38:00 PM
A003    4/14/2014 11:34:34 AM
A004    4/15/2014 12:56:52 PM
A001    4/16/2014 10:54:58 AM
A002    4/17/2014 9:01:19 AM
A003    4/18/2014 12:56:52 PM
A004    4/19/2014 3:38:00 PM
A005    4/20/2014 1:07:49 PM
A006    4/21/2014 3:02:14 PM
A004    4/22/2014 10:55:54 AM
A005    4/23/2014 3:16:28 PM
A006    4/24/2014 8:46:48 AM
A007    4/25/2014 3:53:32 PM
A008    4/26/2014 7:57:27 AM

1 个答案:

答案 0 :(得分:-1)

我从未使用过10g,仍然在SQL Server上共享一些LOGIC,

Declare @cols varchar(max) = ''
Declare @query varchar(max) = ''

select @cols = STUFF((SELECT distinct ',Case When Datediff(dd,sDate,' +
                        QUOTENAME(Cast(sDate as Date),'''')  + ') = 0 then 1 else 0 end as ' + QUOTENAME(Cast(sDate as Date),'') val
                      FROM tv_productdetails
                      ORDER BY val asc
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '')
Select @cols                        

SELECT @query = 'select productid, ' + @cols +' from tv_productdetails '

execute(@query) 

希望它对你有所帮助。进一步的输出可以组合在一起,以达到你所要求的,不知道我用过的所有东西都在10g中。