PIVOT nos permite convertir filas en columnas. Lo podemos incluir en las instrucciones SELECT, pero sólo se puede realizar a una columna.
Si se intenta realizar una consulta con dos operadores PIVOT y se usa la misma columna en la cláusula FOR se genera el siguiente error: «Invalid column name XXXXXXX».
De igual manera, si se utiliza la misma columna con diferentes ALIAS, se produce un error: «The column name XXXXX specified in PIVOT operator conflicts with the existing column name in the PIVOT argument»
La solución es declarar la misma columna, pero cambiando sus valores, adicionando una constante o concatenando algún indicador y asignando un nuevo ALIAS a la columna.
Ejemplo:
Se requiere mostrar el valor y el número de clientes que facturaron el mes actual y el mes anterior en una línea.
Al realizar la consulta:
SELECT
YEAR(I.IssueDate) [Year],
MONTH(I.IssueDate) [Month],
SUM((I.TotalAmmount / I.Rate)) Amount,
COUNT(I.CustomerID) as Number
FROM Invoices I with (nolock)
INNER JOIN InvoiceTypes IT with (nolock) ON (IT.ID = I.TypeID)
AND I.IssueDate > = ‘2011-09-01’
AND I.IssueDate < = ‘2011-10-31’
WHERE I.[IsNull] = 0
AND IT.Code = ‘INVOICE’
AND I.CompanyID = 1
GROUP BY YEAR(I.IssueDate), MONTH(I.IssueDate)
Resultado:
Year Month Amount Number
2011 9 1358651.99 885
2011 10 1426890.12 875
(2 row(s) affected)
Lo que se quiere es que los datos de las columnas Amount y Number, se conviertan en Filas, para mostrar los valores y numero de clientes de la facturación de los últimos dos meses:
Actual Last ActualNumber LastNumber
1426890.12 1358651.99 875 885
Para esto, se debe realizar PIVOT a la columna del mes. Se crean las campos [Month] y MonthNumber, los cuales son los mismos datos; sólo que para mostrar los valores se toma el campo [Month] entre valores [0] [1] y para el número de clientes la columna MonthNumber adquiere valores [10] y [11]:
SELECT @CompanyID,
SUM([0]) Actual,
SUM([1]) Last,
SUM([10]) ActualNumber,
SUM([11]) LastedNumber
from
(
SELECT
YEAR(I.IssueDate) [Year],
CASE
WHEN MONTH(I.IssueDate) = MONTH(GETDATE()) THEN 0
ELSE 1
END as [Month],
CASE
WHEN MONTH(I.IssueDate) = MONTH(GETDATE()) THEN 10
ELSE 11
END as MonthNumber,
SUM((I.TotalAmmount / I.Rate)) Amount,
COUNT(I.CustomerID) as Number
FROM Invoices I with (nolock)
INNER JOIN InvoiceTypes IT with (nolock) ON (IT.ID = I.TypeID)
AND I.IssueDate > = ‘2011-09-01’
AND I.IssueDate < = ‘2011-10-31’
WHERE I.[IsNull] = 0
AND IT.Code = ‘INVOICE’
AND I.CompanyID = 1
GROUP BY YEAR(I.IssueDate), MONTH(I.IssueDate)
) Main
PIVOT (
MAX(Amount) FOR [Month] IN ([0],[1])
) AS PQ
PIVOT (
MAX(Number) FOR MonthNumber IN ([10],[11])
) PQ
RESULTADO:
Actual Lasted ActualNumber LastNumber
———————- ———————- ———— ————
1426890.12 1358651.99 875 885
Siguenos en: