Как можно использовать сводную таблицу в SQL Server с временной таблицей - PullRequest
0 голосов
/ 10 ноября 2018

Очень новый для SQL Server, в настоящее время я хочу использовать запрос с Pivot-таблицей, но что-то не так, Есть ли кто-нибудь, кто мог бы помочь мне найти мою ошибку, которую я ценю. С уважением В первой части я создаю фиктивную таблицу с именем DateTemp, во второй части я соединяю две таблицы - таблицы DateTemp и datcpc, теперь я хочу использовать сводную таблицу, но у меня появляется ошибка рядом с сводной таблицей. раздел.

Мой код:

// 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». »», Я не знаю, является ли это конфигурацией сервера или чем-то другим. Я использую соединение с сервером через Visual Studio 2017 через SqlConnection, мои новые более простые коды перечислены ниже

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 голосов
/ 10 ноября 2018

Я собираюсь предоставить 2 варианта «динамического поворота», который, я надеюсь, поможет:

Некоторые примеры данных:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...