如何在带有临时表的SQL Server中使用数据透视表

时间:2018-11-10 01:04:01

标签: sql sql-server pivot

这是SQL Server的新手,这时我想使用带有数据透视表的查询,但是有些困难,是否可以帮助我找到我喜欢的错误。问候在第一部分中,我创建了一个名为DateTemp的虚拟表,我将两个表DateTempdatcpc表联接在一起,现在我想使用数据透视表,但是我在枢纽部分附近出现错误。

我的代码:

// First Part
DECLARE @StartDate datetime 
DECLARE @EndDate datetime 

SELECT @StartDate = '2018-01-01',  @EndDate = '2018-11-08' 
SELECT @StartDate = @StartDate - (DATEPART(DD, @StartDate) - 1) 

DECLARE @DateTemp TABLE (TheDate DATETIME) 

WHILE (@StartDate <= @EndDate) 
BEGIN 
    INSERT INTO @DateTemp 
    VALUES (@StartDate) 

    SELECT @StartDate = DATEADD(DAY, 1, @StartDate) 
END 

// Second part
SELECT 
    CYALA, CYALB 
FROM
    (SELECT DISTINCT 
         fechab 'FECHA', clapla 'CLAVEPLANTA', clapro 'CLAVE PRODUCTO', 
         CAST(SUM(cantid) AS NUMERIC(9, 2)) 'ACTIVIDAD' 
     FROM 
         (datcpc 
     LEFT JOIN
         (SELECT TheDate 
          FROM @DateTemp 
          WHERE TheDate >= '05/01/2018') NT ON datcpc.fechab = NT.TheDate)
     WHERE 
         datcpc.fechab >= '01/05/2018' 
         AND datcpc.fechab >= '01/05/2018' 
         AND (clapla = 'CYALA' OR clapla = 'CYALB' OR clapla = 'CYAZC')
         AND datcpc.tipflu = 'C'
    GROUP BY 
        fechab, clapla, clapro) AS SOURCE 
PIVOT
    (SUM(SOURCE.ACTIVIDAD) 
         FOR SOURCE.CLAVEPLANTA IN (CYALA, CYALB)
    ) AS PIVOTABLE

测试建议的答案,没有成功。尝试一个简单的示例,即使错误被设置为“ System.Data.SqlClient.SqlException:'第1行:'PIVOT'附近的语法不正确。'”,我不知道这是服务器配置还是它的相关内容。我通过SqlConnection通过Visual Studio 2017使用到服务器的连接,下面列出了新的简单代码

SELECT DISTINCT [CLAVEPLANTA], [ACTIVIDAD]
FROM( 
    SELECT fechab AS [FECHA], clapla AS [CLAVEPLANTA], CAST(SUM(cantid) AS NUMERIC(9,2) ) AS [ACTIVIDAD] FROM datcpc"
    WHERE datcpc.fechab >= '01/05/2018'         
    AND (clapla='CYALA' OR clapla='CYALB' OR clapla='CYAZC')
    GROUP BY fechab, clapla 
 ) AS [SO] 
PIVOT(SUM([SO.ACTIVIDAD]) FOR [SO.CLAVEPLANTA] IN ([CYALA], [CYALB])) AS [PVT];

我真的很感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我将提供“动力枢轴”的两个变体,希望对您有帮助:

一些示例数据:

create table temp
(
    date datetime,
    category varchar(3),
    amount money
)

insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)

现在有一个查询,它将每天将数据“透视”成列:

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), c.[date],121)) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT category, ' + @cols + ' from 
            (
                select convert(char(10), [date],121) [date]
                    , amount
                    , category
                from temp
           ) x
            pivot 
            (
                 sum(amount)
                for [date] in (' + @cols + ')
            ) p '

execute(@query)

结果如下:

+----------+------------+------------+------------+------------+
| category | 2012-01-01 | 2012-02-01 | 2012-02-10 | 2012-03-01 |
+----------+------------+------------+------------+------------+
| ABC      | 1000,0000  | NULL       | NULL       | 1100,0000  |
| DEF      | NULL       | 500,0000   | 700,0000   | NULL       |
| GHI      | NULL       | 800,0000   | NULL       | NULL       |
+----------+------------+------------+------------+------------+

现在,此查询将“类别”分类为列:

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT convert(char(10),date,121) date, ' + @cols + ' from 
            (
                select date
                    , amount
                    , category
                from temp
           ) x
            pivot 
            (
                 max(amount)
                for category in (' + @cols + ')
            ) p '

execute(@query)

结果如下:

+------------+-----------+----------+----------+
|    date    |    ABC    |   DEF    |   GHI    |
+------------+-----------+----------+----------+
| 2012-01-01 | 1000,0000 | NULL     | NULL     |
| 2012-02-01 | NULL      | 500,0000 | 800,0000 |
| 2012-02-10 | NULL      | 700,0000 | NULL     |
| 2012-03-01 | 1100,0000 | NULL     | NULL     |
+------------+-----------+----------+----------+

一些建议:

--Second part

SELECT
    CYALA,CYALB -- you need to specify more columns here
FROM (
    SELECT DISTINCT -- distinct is not needed when grouping, remove this
        fechab                             'FECHA'
       ,clapla                             'CLAVEPLANTA'
       ,clapro                             'CLAVE PRODUCTO'
       ,CAST(SUM(cantid) AS numeric(9, 2)) 'ACTIVIDAD'
    /* if you are creating the temporal table to get EVERY date
    , then @DateTemp should be the base table, and left join the [datcpc] */
    FROM (datcpc
    LEFT JOIN (      
            SELECT
                TheDate
            FROM @DateTemp
            WHERE TheDate >= '05/01/2018' -- use YYYMMDD or YYYY-MM-DD consistently
        ) NT
        ON datcpc.fechab = NT.TheDate)
    WHERE datcpc.fechab >= '01/05/2018'
    AND datcpc.fechab >= '01/05/2018'      -- repeated, not needed
    AND clapla IN('CYALA','CYALB','CYAZC') -- use IN()
    AND datcpc.tipflu = 'C'
    GROUP BY
        fechab ,clapla ,clapro
) AS SOURCE
PIVOT (
    SUM(SOURCE.ACTIVIDAD) 
    FOR SOURCE.CLAVEPLANTA IN (CYALA, CYALB) -- did you want dates here? (as the pivot columns) 
) AS PIVOTABLE