Если вы используете SQL 2005/2008, вы можете использовать pivot/unpivot/dynamic sql. Это отвратительно и не то, что я хотел бы видеть в производственном кодексе:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[table1]') AND type in (N'U'))
DROP TABLE [dbo].[table1]
GO
CREATE TABLE [dbo].[table1](
[id] [int] IDENTITY(1,1) NOT NULL,
[mon] [int] NOT NULL,
[tue] [int] NOT NULL,
[wed] [int] NOT NULL,
[thu] [int] NOT NULL,
[fri] [int] NOT NULL,
[sat] [int] NOT NULL,
[sun] [int] NOT NULL,
CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70) ON [PRIMARY],
) ON [PRIMARY]
GO
INSERT INTO [dbo].[table1]([mon],[tue],[wed],[thu],[fri],[sat],[sun])
VALUES(100, 200, 0, 0, 0, 0, 0)
INSERT INTO [dbo].[table1]([mon],[tue],[wed],[thu],[fri],[sat],[sun])
VALUES(200, 0, 300, 0, 0, 0, 0)
GO
SELECT * FROM [dbo].[table1]
GO
DECLARE @PivotColumnHeaders VARCHAR(MAX)
SELECT @PivotColumnHeaders =
COALESCE(
@PivotColumnHeaders + ',[' + cast([date] as varchar) + ']',
'[' + cast([date] as varchar)+ ']'
)
FROM (
SELECT distinct [date]
FROM table1
UNPIVOT
(qty FOR date IN ([mon],[tue],[wed],[thu],[fri],[sat],[sun])
) AS Unp
WHERE qty != 0
) rtn
SELECT @PivotColumnHeaders
DECLARE @PivotTableSQL NVARCHAR(4000)
SET @PivotTableSQL = N'
SELECT *
FROM (
SELECT [id], [date], [qty]
FROM table1
UNPIVOT
(qty FOR date IN ([mon],[tue],[wed],[thu],[fri],[sat],[sun])
) AS Unp
) piv
PIVOT
(SUM([qty])
FOR [date] IN (' + @PivotColumnHeaders + ')
) AS PivotTable
'
EXECUTE(@PivotTableSQL)
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[table1]') AND type in (N'U'))
DROP TABLE [dbo].[table1]
GO
Какую базу данных вы используете? – Tim
Вы хотите сделать это непосредственно в SQL или использовать язык программирования поверх него. Использование языка программирования значительно упрощает это :) – Programmer