仅显示具有数据值的列

时间:2011-01-04 07:45:45

标签: sql

我不知道是否可能,但我想问你一个问题 假设我有一张桌子

表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之类的查询 因为没有。显示列可能会改变。

请回复我。

谢谢....

2 个答案:

答案 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