我不知道是否可能,但我想问你一个问题 假设我有一张桌子
表1
id | mon | tue | wed | thu | fri | sat | sun
1 | 100 | 200 | 0 | 0 | 0 | 0 | 0
2 | 200 | 0 | 300 | 0 | 0 | 0 | 0
所以从给定的表结果应该是......
id | mon | tue | wed |
1 | 100 | 200 | 0 |
2 | 200 | 0 | 300 |
如表1所示,不同的一周列。
如果列中的所有值都为0或null,则查询应忽略以显示该列(如结果所示)
注意:如果我们以select * from table1
运行查询,则会显示所有列。
虽然我不想要select id,mon,tue,wed from table1
之类的查询
因为没有。显示列可能会改变。
请回复我。
谢谢....
答案 0 :(得分:2)
我所知道的任何SQL方言都无法实现这样的功能。
您执行SELECT * FROM ....
并取回所有列,或者执行SELECT col1, col2, ...., coln FROM ....
并返回定义的列。
标准SQL中没有办法只返回那些具有值的列....您可以检查行(.. WHERE Col1 IS NOT NULL ...
)但不检查列。
这样的功能需要在您的UI中实现 - 使用您正在使用的任何语言。这不是数据库可以为您做的事情。
答案 1 :(得分:0)
如果您使用的是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