我正在嘗試使用dataTable.Rows.Count,但根據特定引數對結果進行排序。該引數在我的DataTable. 以便輸出僅提供與該不同值有關的行。我DataTable在 a 中View,但我需要使用 a 中的排序int值ViewModel。
我可以用public static int o { get; set; }和 a
來計算dt.Rows.Count我的DataTable. 然后我通過View在 my 中實體化my ViewModel,使用int numberOfRows = ViewName.o;.
但這給了我總行數,而我需要“Column1”中每個不同值的行數。
我的問題是,我在哪里以及如何進行所需的排序?因為當我盡可能地計算它們并將它們添加到int(在我的ViewModel)中時,沒有辦法知道它們曾經代表哪一行,對嗎?如果我嘗試以某種方式對DataTable(in the View)進行排序,我不知道如何參考不同的值。隨著程式的使用,它們可能會不時變化,因此我無法對其進行硬編碼。
評論建議改用查詢,添加我的存盤程序以幫助實作解決方案:
SET NOCOUNT ON
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[myProcedure]
@param myUserDefinedTableType readonly
AS
BEGIN TRANSACTION
INSERT INTO [dbo].[myTable] (/* list of columns */)
SELECT [Column1], /* this is the column I need to sort by */
-- more columns
-- the rest of the columns
/* I do aggregations to my columns here, I am adding several thousands row to 20 summarized rows, so after this line, I can no longer get ALL the rows per "Column1", but only the summarized rows. How can I count the rows BEFORE I do the aggregations? */
FROM @param
GROUP BY [Column2], [Column1]
ORDER BY [Column2], [Column1]
// Some UPDATE clauses
COMMIT TRANSACTION
uj5u.com熱心網友回復:
我認為最明智的選擇是在db方面采取行動。
假設您使用的是 SQL Server,查詢應該是:
SELECT *, COUNT(*) OVER (PARTITION BY Column1) AS c
FROM Table1
ORDER BY c
此查詢回傳表“Table1”上的資料,以及每行表示“Column1”值計數的列“c”。
最后,它會根據您的要求按“c”列對行進行排序。
編輯
為了完成這個任務,我將使用一個公共表運算式:
-- Code before INSERT...
;WITH CTE1 AS (
SELECT *,
COUNT(*) OVER (PARTITION BY [Column1]) AS c
FROM @param
)
INSERT INTO [dbo].[myTable] (/* list of columns - must add the column c */)
SELECT [Column1],
[Column2],
[c],
-- aggregated columns
FROM CTE1
GROUP BY [Column2], [Column1], c
-- Code after INSERT...
在公共表運算式“CTE1”中,我選擇了@param 中的所有值,添加了一個列“c”,其中包含每個 Column1 的計數。
注意:如果您有 5 行具有相同的 Column1 值,但在 Column2 中有兩個不同的值,則在 myTable 中,您將有兩行(因為 GROUP BY [Column2], [Column1]),均具有 c=5。
如果您想獲得按 Column1 和 Column2 分組的計數,則必須按如下方式宣告 c:COUNT(*) OVER (PARTITION BY [Column1], [Column2]) AS c。
我希望我很清楚,如果不是,我可以用不同的方式解釋它。
例子
CREATE TABLE myTable (col1 VARCHAR(50), col2 INT, col3 INT, c INT)
CREATE TYPE myUserDefinedTableType AS TABLE (column1 VARCHAR(50), column2 INT, column3 INT)
DECLARE @param myUserDefinedTableType
INSERT INTO @param VALUES ('A', 1, 4), ('A', 2, 3), ('A', 2, 6), ('B', 2, 3)
;WITH CTE1 AS (
SELECT *, COUNT(*) OVER (PARTITION BY [Column1]) AS c
FROM @param
)
INSERT INTO [myTable]([col1], [col2], [col3], [c])
SELECT [column1], [column2],
-- aggregated columns
MAX([column3]),
-- count
[c]
FROM CTE1
GROUP BY [column2], [column1], c
uj5u.com熱心網友回復:
DataView dv = dt.DefaultView;
dv.Sort = "SName ASC"; -- your column name
DataTable dtsorted = dv.ToTable();
DataTable dtsorted = dv.ToTable(true, "Sname","Surl" ); //return distinct rows
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312312.html
