2011-01-04 6 views
1

Я не знал, что это возможно или нет, но я хочу задать вам вопрос, как предположим, у меня есть таблица, какпоказать только те столбцы, которые имеют значение данных

table1

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 | 

, как показано в table1 разных столбцов недели.

Если все значения в столбце 0 или NULL, то запрос должен игнорировать, чтобы показать, что столбец (как показано в результате)

Примечание: если мы запустим запрос как select * from table1 он показывает все столбцы.

Хотя я не хочу получить такой запрос, как select id,mon,tue,wed from table1 , потому что нет. отображаемых столбцов.

Пожалуйста, ответьте мне.

Спасибо ....

+0

Какую базу данных вы используете? – Tim

+2

Вы хотите сделать это непосредственно в SQL или использовать язык программирования поверх него. Использование языка программирования значительно упрощает это :) – Programmer

ответ

2

Нечто подобное не представляется возможным в любом SQL диалекте я знаю.

Либо вы делаете SELECT * FROM .... и вернуть все столбцы, или вы делаете SELECT col1, col2, ...., coln FROM .... и получить обратно эти столбцы определены.

Там нет никакого способа в стандарте SQL, чтобы получить обратно только те столбцы, которые имеют значение .... вы можете сделать проверку на строках (.. WHERE Col1 IS NOT NULL ...), но не на колоннах.

Функциональность, подобная этой, должна быть реализована в пользовательском интерфейсе - с использованием любого языка, который вы используете. Это не то, что может сделать база данных для вас.

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 
Смежные вопросы