-1

私はこのようなSQLデータを持っています

1 2m
2 3m
3 3m
6 6m
7 6m

データグリッドビューにエクスポートして表示したい。

1 2m
2 3m
3 3m
4 0m
5 0m
6 6m
7 6m

そして、ここに私のコードがあります:

private void laygio(string tenstore, string tenxuat)
{
    string conn = "Data Source=USER-PC;Initial Catalog=NCKHmoi;Integrated Security=True";
    SqlConnection connect = new SqlConnection(conn);
    SqlCommand command = new SqlCommand();
    command.Connection = connect;
    connect.Open();
    int stday = Convert.ToInt32(dst.Text);
    int stmonth = Convert.ToInt32(mst.Text);
    int styear = Convert.ToInt32(yst.Text);
    int sthour = Convert.ToInt32(hst.Text);
    int stminute = 0;
    int stsecond = 0;
    int eday = Convert.ToInt32(ded.Text);
    int emonth = Convert.ToInt32(med.Text);
    int eyear = Convert.ToInt32(yed.Text);
    int ehour = Convert.ToInt32(hed.Text);
    int eminute = 0;
    int esecond = 0;
    DateTime startday = new DateTime(styear, stmonth, stday, sthour, stminute, stsecond);
    DateTime endday = new DateTime(eyear, emonth, eday, ehour, eminute, esecond);
    DataTable tbl = new DataTable();
    DataColumn Col = new DataColumn("Thời gian", typeof(int));
    tbl.Columns.Add(Col);
    SqlDataAdapter adapter = new SqlDataAdapter();
    int i = 1;
    for (DateTime xday = startday; xday <= endday; xday += TimeSpan.FromHours(1))
    {
        int ngay = Convert.ToInt32(xday.Day.ToString());
        int thang = Convert.ToInt32(xday.Month.ToString());
        int nam = Convert.ToInt32(xday.Year.ToString());
        int gio = Convert.ToInt32(xday.Hour.ToString());
        command.CommandType = CommandType.Text;
        command.CommandText = @"Select SoLieuGio.LLNuoc from SoLieuGio where SoLieuGio.GioID= (select Gio.GioID from Gio where (Gio.Gio = @Gio and Gio.NgayID= (select Ngay.NgayID from Ngay where (Ngay.Ngay=@Ngay and Ngay.ThangID= (select Thang.ThangID from Thang where (Thang.Thang = @Thang and Thang.NamID=(select Nam.NamID from Nam where  (Nam.Nam = @Nam and Nam.TramID=(select Tram.TramID from Tram Where (Tram.TenTram like @TenTram and Tram.TinhID=(select Tinh.TinhID from Tinh where  (Tinh.TenTinh like @TenTinh and Tinh.KhuVucID=(select KhuVuc.KhuVucID from KhuVuc where KhuVuc.Ten=@Ten)))))))))))))";
        command.Parameters.Add("@Gio", SqlDbType.BigInt).Value = gio;
        command.Parameters.Add("@Ngay", SqlDbType.BigInt).Value = ngay;
        command.Parameters.Add("@Thang", SqlDbType.BigInt).Value = thang;
        command.Parameters.Add("@Nam", SqlDbType.BigInt).Value = nam;
        command.Parameters.Add("@Ten", SqlDbType.NVarChar, 50).Value = "Đồng Bằng Bắc Bộ";
        command.Parameters.Add("@TenTinh", SqlDbType.NVarChar, 50).Value = TinhComboBoxEx.Text;
        command.Parameters.Add("@TenTram", SqlDbType.NVarChar, 50).Value = TramComboBoxEx.Text;
        adapter.SelectCommand = command;
        adapter.Fill(tbl);
        dataGridView2.DataSource = tbl;            
        command.Parameters.Clear();
    }
    command.Dispose();
    connect.Close();
}

そのコードの結果は次のとおりです。

1 2m 2 3m 3 3m 6 6m 7 6m

1 から 7 まで完全に表示するには、何を修正する必要がありますか。

4

3 に答える 3

2

集計テーブルmaster..spt_valuesを使用して、シリーズの欠落アイテムに対処できます。

これを行うには、テーブルに左結合し、値を結合します。

例えば

CREATE TABLE ATable
    ([Number] int, [value] varchar(2))
;

INSERT INTO ATable
    ([Number], [value])
VALUES
    (1, '2m'),
    (2, '3m'),
    (3, '3m'),
    (6, '6m'),
    (7, '6m')
;

これ

SELECT
  v.Number,
  COALESCE(ATable.Value, '0m') Value
FROM
  master..spt_values  v
  LEFT JOIN ATable
  ON v.Number = ATable.Number
WHERE
  v.Type = 'P'
  and v.Number > 0 and v.Number < 8

この値を生成します

| NUMBER | VALUE |
------------------
|      1 |    2m |
|      2 |    3m |
|      3 |    3m |
|      4 |    0m |
|      5 |    0m |
|      6 |    6m |
|      7 |    6m |

デモ

于 2013-04-17T14:30:26.197 に答える
0

この場合の最も簡単な方法は、現在の値が前の値 + 1 の合計であるかどうかを毎回確認することだと思います

if (current != (previous + 1)
{
    //make new 4 0m or something
}
else
{
    //continue reading
}
于 2013-04-17T06:38:21.653 に答える
0

欠損値を保持する一時テーブルを作成してから、メイン テーブルと一時テーブルを結合してみてください。

これはそれがどのように見えるかです

create table #temp1
(
    ID int identity(1,1),
    M varchar(4)
)
declare @count int
SET @count = 0

declare @max int
SET @max = 20

while @count < @max
begin
insert into #temp1 (M) values ('0m') 
SET @count = @count + 1
end

select * from #temp1

select (case M1.ID when null then T1.ID else M1.ID) as ID,
(case M1.M when null then T1.M else M1.ID) as TXT
from MainTable M1
join #temp1 T1
order by ID
于 2013-04-17T09:08:55.107 に答える