【问题标题】:SQL Server calculate dynamic columnsSQL Server 计算动态列
【发布时间】:2014-08-26 09:07:02
【问题描述】:

有一个给定的表,结构如下:

DateAndTime             | Count Wine | Count Beer

2014-08-11 16:45:22.480 | 100        | 50

2014-08-12 16:45:22.480 | 50         | 50

2014-08-18 16:45:22.480 | 200        | 100

2014-08-19 16:45:22.480 | 300        | 200

我需要的是一个带有以下输出的 select 语句:

---  | Week No 33 | Week No 34

Beer | 50         | 150

Wine | 75         | 250 

因此,列(周数)动态取决于数据。 并且计算的值应该是日历周内行的平均值。

我不知道如何解决这个问题......

【问题讨论】:

标签: sql sql-server


【解决方案1】:

不确定这是否是一种优雅的方式..但这有效。

create table sample 
(
dtdate smalldatetime,
cWine int,
cBeer int
)

insert into sample 
values('2014-08-11 16:45:22.480', 100 , 50),('2014-08-12 16:45:22.480', 50, 50),
('2014-08-18 16:45:22.480', 200 , 100),('2014-08-19 16:45:22.480', 300 , 200)



   DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
   select @cols = STUFF((SELECT distinct ',' + QUOTENAME(DATEPART(WEEK,dtDate)) from sample  FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')


    SELECT @query = 'SELECT Countname, '+@cols+'
FROM
(

  SELECT countName,y,Avg(CountValue)avge from 

(
SELECT countName,countValue,dtdate,DATEPART(WEEK,dtdate)as y from  sample
unpivot(
countValue for Countname in (cwine,cBeer)
)unpiv )x group by y,countName


) x
pivot
(
  sum(avge)
  for y in ('+@cols+')
) p'


execute(@query)

【讨论】:

  • 你读过问题吗? OP说`列(周数)动态取决于数据`
  • 是的,这个例子是有效的。但是周列不是根据给定数据动态创建的;-)
  • 你的意思是..即使一年有 52 周,它也应该只为那些有数据的周生成列?
  • 是的,只显示有数据的这周。整个语句应用作 Excel 中的数据库查询。对于当前示例,它不起作用。我认为这是因为在 Server Management Studio 中我也得到了两个结果集。
  • 如果解决了您的问题,请将其标记为已回答:)
【解决方案2】:
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(DATEPART(WEEK,dtdate)) 
                    from master.sample 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



 SELECT @query = 'SELECT Countname, '+@cols+'
FROM
(

  SELECT countName,y,Avg(CountValue)avge from 

(
SELECT countName,countValue,dtdate,DATEPART(WEEK,dtdate)as y from  sample
unpivot(
countValue for Countname in (cwine,cBeer)
)unpiv )x group by y,countName


) x
pivot
(
  sum(avge)
  for y in ('+@cols+')
) p'

SELECT @query 
execute(@query)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多