Member 11856456 Ответов: 3

Как использовать функции min и max в VB.NET использование инструкции SQL


Часть того, что я делаю, я выяснил благодаря помощи онлайн-блога. Теперь я пытаюсь выяснить,как добавить минимальное и максимальное значение к оператору.

вот что у меня сейчас есть:

     Dim sqlcon As New SqlConnection("mysqlstatement")
        Dim myCmd As New SqlCommand("SELECT 
    [TableName] = so.name, 
    [RowCount] = MAX(si.rows) 
FROM 
    sysobjects so, 
    sysindexes si 
WHERE 
    so.xtype = 'U' 
    AND 
    si.id = OBJECT_ID(so.name) 
GROUP BY 
    so.name 
ORDER BY 
    2 DESC", sqlcon)


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

Чтобы улучшить этот вопрос для ясности-

Я настроил событие listview, которое имеет следующие поля:

таблица / записи| age_min| age_max| база данных|
получила 2000 18 76 sales2016
сотрудники 200 19 64 employees2016

код, который я предоставил выше, плюс этот код:

sqlcon.Open()
       Dim myReader As SqlDataReader = myCmd.ExecuteReader

       While myReader.Read
           Dim newlistviewitem As New ListViewItem
           newlistviewitem.Text = myReader.GetString(0)
           newlistviewitem.SubItems.Add(myReader.GetInt32(1))
           ListView1.Items.Add(newlistviewitem)


       End While

       sqlcon.Close()


Позволяет мне генерировать информацию о таблицах и записях, которая представляет собой просто количество строк в таблице. Эта информация отображается в виде списка. Проблема в том, что мне нужно включить информацию о возрасте (мин/макс) этой информации столбца, но то, как написано исходное утверждение, Я не могу. Мне нужна помощь с возможным переписыванием, чтобы включить всю информацию или добавить к исходному коду.

Что я уже пробовал:

Я попытался использовать syscolumns в операторе и назвал его sc.
поэтому я попытался настроить его с помощью sc.name и sc.id когда я подключил имя, все, что я получил, было просто "имя", которое было "возрастом", а не числовыми значениями, которые я искал.

OriginalGriff

Это не так ясно (по крайней мере для меня), что именно вы пытаетесь получить. Возможно, если вы предоставите примеры табличных данных и покажете нам, что вы получаете от этого запроса и что вы хотите от своей БД, это может помочь?
Используйте виджет" улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Member 11856456

OrigianlGriff,

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

3 Ответов

Рейтинг:
2

NightWizzard

Я немного подумал о вашей проблеме и вот решение, которое, я думаю, вы ищете:
1) Создайте хранимую процедуру типа

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE GetTableInfos

AS
BEGIN
	SET NOCOUNT ON;

	DECLARE @Schema nvarchar(200);
	DECLARE @Table nvarchar(200);
	DECLARE @Column nvarchar(200);
	DECLARE @Cmd nvarchar(4000);
	DECLARE @TableInfos TABLE
			(
			 [SchemaName] nvarchar(200)
			,[TableName] nvarchar(200)
			,[RowCount] int
			,[MinAge] int
			,[MaxAge] int
			)

	DECLARE curLoop CURSOR LOCAL FAST_FORWARD FOR
		SELECT [TABLE_SCHEMA]
			 , [TABLE_NAME]
			 , [COLUMN_NAME]
		  FROM [INFORMATION_SCHEMA].[COLUMNS]
		 WHERE ([COLUMN_NAME] = 'Age')
		   AND ([DATA_TYPE] = 'int');

	OPEN curLoop;

	WHILE (1 = 1)
		BEGIN
			FETCH NEXT FROM curLoop INTO @Schema, @Table, @Column;

			IF (@@FETCH_STATUS <> 0)
				BREAK;

			SET @Cmd = 'SELECT ''' + @Schema + '''
							 , ''' + @Table + '''
							 , (SELECT COUNT(*) FROM [' + @Schema + '].[' + @Table + '])
							 , (SELECT MIN([' + @Column + ']) FROM [' + @Schema + '].[' + @Table + '] WHERE ([' + @Column + '] IS NOT NULL))
							 , (SELECT MAX([' + @Column + ']) FROM [' + @Schema + '].[' + @Table + '] WHERE ([' + @Column + '] IS NOT NULL))'

			 INSERT INTO @TableInfos
							 (
							  [SchemaName]
							 ,[TableName]
							 ,[RowCount]
							 ,[MinAge]
							 ,[MaxAge]
							 )
			 EXEC sp_executesql @Cmd;
		END

	CLOSE curLoop;
	DEALLOCATE curLoop;

	SELECT * FROM @TableInfos;
END
GO


Вы можете изменить имя столбца, содержащего возраст для агрегирования, или добавить дополнительные информационные столбцы в результирующий набор.

2) Измените свой оператор SELECT, чтобы получить информацию о таблице в
EXECUTE [dbo].[GetTableInfos]


Это вернет результирующий набор из хранимой процедуры.
Надеюсь, это будет соответствовать вашим потребностям?

Удачи вам!


Рейтинг:
2

Patrice T

Цитата:
Как использовать функции min и max в VB.NET использование инструкции SQL

попробуйте воспользоваться учебным сайтом по SQL

Функция SQL MAX() [^]
Функция SQL MIN() [^]
Учебник по SQL[^]


Рейтинг:
0

NightWizzard

Вы не можете смешивать записи таблиц с агрегатами по одному и тому же файлу одной и той же таблицы в одном файле. SELECT заявление. Самый простой способ решить эту проблему-объединить второй запрос с агрегированными значениями следующим образом:

SELECT t.[Age]
	 , mm.[MIN]
	 , mm.[MAX]
  FROM [dbo].[<Tablename>] t
      ,(SELECT MIN([Age]) AS [MIN]
	         , MAX([Age]) AS [MAX]
         FROM [dbo].[<Tablename>]
		WHERE ([Age] IS NOT NULL)) mm


Member 11856456

NightWizzard,

Единственная проблема с решением, которое вы дали, заключается в том, что оно дает значения не для всех таблиц, а только для одной. Я должен заставить его генерировать возраст min и max вместе с именем таблицы, с которой он связан.

NightWizzard

Я не знаю вашей модели данных, поэтому мне трудно подтолкнуть вас в правильном направлении. Если это означает, что вам нужно собрать минимальный и максимальный возраст из нескольких таблиц, вы можете использовать оператор UNION для объединения источников таблиц. Если это означает, что вы должны получить минимальный максимальный возраст для изменения таблиц из их индивидуально связанных таблиц, вы должны создавать команды SQL динамически с использованием переменных. Надеюсь, это поможет...? В противном случае было бы неплохо улучшить свой вопрос описанием всех таблиц, к которым вы хотите получить доступ.

Member 11856456

NightWizzard,

Я просто изменил и улучшил свой вопрос не так давно в надежде внести больше ясности.

NightWizzard

Извините, но из вашего улучшения я не могу понять, из каких таблиц вы хотите читать, какие возрастные столбцы они содержат и как событие listview будет снабжено данными.

Member 11856456

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

NightWizzard

Думаю, теперь я понимаю вашу проблему. В этом случае и поскольку вы не можете поместить агрегаты min и max в один оператор SELECT, я бы использовал хранимую процедуру (или табличную функцию), которая использует имя таблицы и имя столбца, содержащего возраст, в качестве параметров и использует функцию sp_executesql для создания динамического оператора sql, как показано в моем решении выше, чтобы вернуть необходимые данные. Здесь вы можете найти всю информацию о том, как использовать sp_executesql: https://msdn.microsoft.com/de-de/library/ms188001.aspx