Reputation: 1021
I would like to know if is there an option to make a select from some tables and the result look like this:
The "Text1", "Text3","Text3"
I will take from DB, the SUBTEXT
I don't have in DB and I'm supposed to write by my self, the Date
also is from DB and the values to fulfill the table.
Upvotes: 0
Views: 969
Reputation: 82306
You can use PIVOT.
The only drawback is you cannot pivot without programming the pivot column names manually (FOR SellDay IN ( [20150101], [20150201] )
).
;WITH CTE_Products AS
(
SELECT 1 AS Product, 'CatFood' AS SubCategory, 'Food' AS Category, 1.0 AS Price
UNION SELECT 2 AS Product, 'DogFood' AS SubCategory, 'Food' AS Category, 2.0 AS Price
UNION SELECT 3 AS Product, 'HumanFood' AS SubCategory, 'Food' AS Category, 3.0 AS Price
UNION SELECT 5 AS Product, 'Windows Software' AS SubCategory, 'Software' AS Category, 4.0 AS Price
UNION SELECT 6 AS Product, 'Mac Software' AS SubCategory, 'Software' AS Category, 5.0 AS Price
UNION SELECT 4 AS Product, 'Linux Software' AS SubCategory, 'Software' AS Category, 0.0 AS Price
)
,CTE_SALES AS
(
SELECT 1 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 3 AS Quantity
UNION SELECT 2 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 6 AS Quantity
UNION SELECT 3 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 4 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 5 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 6 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 1 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 3 AS Quantity
UNION SELECT 2 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 6 AS Quantity
UNION SELECT 3 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 4 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 5 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 6 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
)
SELECT *
FROM
(
SELECT
Category
,SubCategory
,SellDay
,Quantity * Price AS Value
FROM CTE_Products
LEFT JOIN CTE_SALES
ON SalesProduct = Product
) AS SourceTable
PIVOT
(
SUM(Value)
FOR SellDay IN ( [20150101], [20150201] )
) AS PivotTable
You can also do it half-dynamically, like this:
IF OBJECT_ID('tempdb..#MySales') IS NOT NULL
DROP TABLE #MySales
IF OBJECT_ID('tempdb..##MyPivottedResults') IS NOT NULL
DROP TABLE ##MyPivottedResults
DECLARE @cols nvarchar(MAX)
;WITH CTE_Products AS
(
SELECT 1 AS Product, 'CatFood' AS SubCategory, 'Food' AS Category, 1.0 AS Price
UNION SELECT 2 AS Product, 'DogFood' AS SubCategory, 'Food' AS Category, 2.0 AS Price
UNION SELECT 3 AS Product, 'HumanFood' AS SubCategory, 'Food' AS Category, 3.0 AS Price
UNION SELECT 5 AS Product, 'Windows Software' AS SubCategory, 'Software' AS Category, 4.0 AS Price
UNION SELECT 6 AS Product, 'Mac Software' AS SubCategory, 'Software' AS Category, 5.0 AS Price
UNION SELECT 4 AS Product, 'Linux Software' AS SubCategory, 'Software' AS Category, 0.0 AS Price
)
,CTE_SALES AS
(
SELECT 1 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 3 AS Quantity
UNION SELECT 2 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 6 AS Quantity
UNION SELECT 3 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 4 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 5 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 6 AS SalesProduct, CAST('20150101' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 1 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 3 AS Quantity
UNION SELECT 2 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 6 AS Quantity
UNION SELECT 3 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 4 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 5 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
UNION SELECT 6 AS SalesProduct, CAST('20150201' AS datetime) AS SellDay, 9 AS Quantity
)
SELECT
Category
,SubCategory
,SellDay
,Quantity * Price AS Value
INTO #MySales
FROM CTE_Products
LEFT JOIN CTE_SALES
ON SalesProduct = Product
SELECT
@cols = COALESCE(@cols + N', ', N'') + N'[' + CONVERT(nchar(8), SellDay, 112) + N']'
FROM #MySales
GROUP BY SellDay
ORDER BY SellDay ASC -- DESC ?
SET @cols = N'
SELECT *
INTO ##MyPivottedResults
FROM #MySales
PIVOT(SUM(Value)
FOR SellDay IN (' + @cols + ')) AS PivotTable
'
-- PRINT @cols
EXECUTE(@cols)
SELECT *
FROM ##MyPivottedResults
IF OBJECT_ID('tempdb..#MySales') IS NOT NULL
DROP TABLE #MySales
IF OBJECT_ID('tempdb..##MyPivottedResults') IS NOT NULL
DROP TABLE ##MyPivottedResults
Upvotes: 1