Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 以表格格式分组_Sql Server 2005_Group By_Pivot - Fatal编程技术网

Sql server 2005 以表格格式分组

Sql server 2005 以表格格式分组,sql-server-2005,group-by,pivot,Sql Server 2005,Group By,Pivot,我正在运行下面这样的select语句,以提取特定时期的逐项销售报告 SELECT prod_description as Product, sum(prod_amount) as Total_sales, date from cash_bill group by date,prod_description 我以垂直格式获得如下输出: ITEM Name Sales Date Apple

我正在运行下面这样的select语句,以提取特定时期的逐项销售报告

SELECT prod_description as Product,
    sum(prod_amount) as Total_sales,
    date 
from cash_bill  
group by date,prod_description
我以垂直格式获得如下输出:

ITEM Name Sales Date Apple 35 12-12-2012 Orange 10 12-12-2012 Apple 20 13-12-2012 Orange 12 13-12-2012 banana 10 13-12-2012 Apple 50 14-12-2012 Orange 40 14-12-2012 banana 20 14-12-2012 商品名称销售日期 苹果35 2012年12月12日 橙色10 12-12-2012 苹果20 13-12-2012 橙色12 13-12-2012 香蕉10 13-12-2012 苹果50 14-12-2012 橙色40 14-12-2012 香蕉20 14-12-2012 但我希望以如下表格格式输出:

Item Name 12-12-2012 13-12-2012 14-12-2012 Apple 35 20 50 Orange 10 12 40 banana 0 10 20 项目名称12-12-2012 13-12-2012 14-12-2012 苹果352050 橙色101240 香蕉0 10 20
如何实现这一点?

这种类型的数据转换是一个非常复杂的问题。从SQLServer2005开始,有一个函数可以为您执行这种类型的数据旋转

如果您提前知道日期值,则可以硬编码这些值:

select product,
  isnull([12-12-2012], 0) [12-12-2012], 
  isnull([12-13-2012], 0) [12-13-2012], 
  isnull([12-14-2012], 0) [12-14-2012]
from
(
  select 
    prod_description as Product,
    prod_amount,
    convert(char(10), date, 110) date
  from cash_bill  
) src
pivot
(
  sum(prod_amount)
  for date in ([12-12-2012], [12-13-2012], [12-14-2012])
) piv

如果在运行时之前日期未知,或者希望结果灵活,则可以使用动态SQL来透视数据。动态版本获取您希望作为列的日期列表,然后使用这些值创建sql字符串,以便您可以透视:

DECLARE @cols AS NVARCHAR(MAX),
    @colsNull AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), date, 110)) 
                    from cash_bill
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsNull = STUFF((SELECT distinct ', IsNull(' + QUOTENAME(convert(char(10), date, 110))+', 0) as '+QUOTENAME(convert(char(10), date, 110))
                    from cash_bill
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT product,' + @colsNull + ' from 
             (
                select 
                  prod_description as Product,
                  prod_amount,
                  convert(char(10), date, 110) date
                from cash_bill  
            ) x
            pivot 
            (
                sum(prod_amount)
                for date in (' + @cols + ')
            ) p '

execute(@query)

两者都给出了结果:

| PRODUCT | 12-12-2012 | 12-13-2012 | 12-14-2012 |
--------------------------------------------------
|   Apple |         35 |         20 |         50 |
|  banana |          0 |         10 |         20 |
|  Orange |         10 |         12 |         40 |

另外,您是否绝对需要SQL Server格式化的结果,或者可以在前端执行此操作?(可能在报告解决方案中)@lc。不需要升级sql server。SQLServer2005具有可作为数据源的
pivot
函数result@bluefeet你说得对。出于某种原因,我认为它是在2008年添加的。