sql - 基于日期之间的数据透视表求和

标签 sql sql-server

我真的很想问一下sql server中的数据透视表。我试图在结构是这样的地方做一些查询。

DECLARE @cols AS NVARCHAR(MAX) 
DECLARE @query  AS NVARCHAR(MAX)
DECLARE @tanggal_awal date
DECLARE @tanggal_akhir date
DECLARE @print nvarchar(MAX)

CREATE TABLE #datatable  
(
    product_id int,
    product_date date,
    product_ammount int
)

SET @tanggal_awal = convert(date,'02-01-2017')
SET @tanggal_akhir = convert(date,'02-27-2017')



insert into #datatable (product_id,product_date,product_ammount) VALUES 
            (1,getdate(),100),
            (1,getdate(),900),
            (2,dateadd(DD,-1,getdate()),400),
            (3,DATEADD(DD,4,getdate()),300),
            (1,dateadd(DD,4,getdate()),200),
            (2,dateadd(DD,2,getdate()),700),
            (4,dateadd(DD,-3,getdate()),1000)

--SELECT * FROM @datatable

;WITH CTE (datelist,maxdate) AS 
(
    select min(@tanggal_awal) datelist, max(product_date) maxdate
    from #datatable
    union all
    select dateadd(dd, 1, datelist), @tanggal_akhir
    from cte
    where datelist < maxdate
) SELECT c.datelist 
    into #temp
    from cte c

select @cols =  STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), datelist, 120)) 
                from #temp
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
                ,1,1,'')

--SELECT d.datelist, b.product_id, SUM(b.product_ammount) 
--  FROM #temp d left join #datatable b on 
--  d.datelist between @tanggal_awal and @tanggal_akhir
--  AND d.datelist = b.product_date
--  GROUP BY b.product_id, d.datelist

--select b.product_id, d.datelist, 
--                sum(b.product_ammount) PivotDate
--                from #datatable b
--                left join #temp d
--                on d.datelist between @tanggal_awal and @tanggal_akhir
--              and d.datelist = b.product_date
--group by b.product_id, d.datelist
--order by b.product_id


SET @query = 'SELECT product_id, '+@cols+' FROM 
             (
                select b.product_id, d.datelist, convert(CHAR(10), datelist, 120) PivotDate
                from #datatable b
                left join #temp d
                on d.datelist between @tanggal_awal and @tanggal_akhir
                and d.datelist = b.product_date

            ) x
            pivot 
            (
                count(datelist)
                for PivotDate in (' +@cols+ ')
            ) p'

             
EXECUTE sp_executesql @query ,N'@tanggal_awal DATE, @tanggal_akhir DATE', @tanggal_awal,@tanggal_akhir
GO
drop table #temp
go
drop table #datatable

此查询的结果主要是相应日期中“product_id”的计数。但是,我想像这样基于 product_ammount 获得总和。

-------------------------------------
|product_id| 2017-01-02 | 2017-02-02|
-------------------------------------
|1         | 0          | 1000      |
-------------------------------------
|2         | 900        | 0         |
-------------------------------------
|3         | 700        | 0         |
-------------------------------------

谁能给我最好的方法来一起处理连接和枢轴,尤其是对于这种情况?非常感谢。

--更新 经过Shakeer Mirza的查询,结果是这样的。

enter image description here

我们可以分组吗?

最佳答案

试试下面这个。我认为您需要将 Pivot 更改为 SUMproduct_ammount和 qry Xproduct_ammount在选择

SET @query = 'SELECT product_id, '+@cols+' FROM 
             (

                select b.product_id,  convert(CHAR(10), datelist, 120) PivotDate,  product_ammount  
                from #datatable b
                left join #temp d
                on d.datelist between  @tanggal_awal and @tanggal_akhir
                and d.datelist = b.product_date


            ) x
            pivot 
            (
                sum(product_ammount)
                for PivotDate in (' +@cols+ ')
            ) p'


EXECUTE sp_executesql @query ,N'@tanggal_awal DATE, @tanggal_akhir DATE', @tanggal_awal,@tanggal_akhir
GO
drop table #temp
go
drop table #datatable

更新: 替换 Null

DECLARE @COLS_ISNULL VARCHAR(MAX)='';

SELECT @COLS_ISNULL = @COLS_ISNULL +COLS_ISNULL+',' FROM (
SELECT distinct   'ISNULL('+QUOTENAME(convert(CHAR(10), datelist, 120))+',0) 'as COLS_ISNULL
                from #temp)A
--to remove last comma.
SELECT @COLS_ISNULL = SUBSTRING (@COLS_ISNULL,1,LEN(@COLS_ISNULL)-1)

并在您的@query 的 Select 中替换上面的 @COLS_ISNULL。

SET @query = 'SELECT product_id, '+@COLS_ISNULL+' FROM 
             (

                select b.product_id,  convert(CHAR(10), datelist, 120) PivotDate,  product_ammount  
                from #datatable b
                left join #temp d
                on d.datelist between  @tanggal_awal and @tanggal_akhir
                and d.datelist = b.product_date


            ) x
            pivot 
            (
                sum(product_ammount)
                for PivotDate in (' +@cols+ ')
            ) p'

来自评论:

这是我的 SSMS 的输出

enter image description here

关于sql - 基于日期之间的数据透视表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42106098/

相关文章:

mysql - SQL DELETE LEFT JOIN 查询

sql - FROM 内的WITH 的替代方案

sql - 我将如何在这个临时表上创建索引?

sql - Microsoft SQL 计数问题

mysql - 像存储过程参数一样使用 SQL LIKE 运算符

sql - 使用 T-SQL 从具有特定模式的段落中删除一个句子

sql-server - 在 WHILE 循环中使用 GETDATE() 总是返回相同的值

mysql - 当我必须连接一个表两次时,如何在 SQL 中正确使用内连接?

c# - 如何使用 Join 搜索字段?

sql - SSIS OnPostExecute 事件 : How to see the execution result?