基于日期范围的 SQLite Sum 列
SQLite Sum Column based on Date Range
晚上好,我有以下table
public class SalesRecord
{
[PrimaryKey, AutoIncrement]
public int SalesRecID { get; set; }
[Indexed]
public string SalesRecDate { get; set; }
public string SalesRecCustName { get; set; }
public string SalesRecProdName { get; set; }
public int SalesRecProdQty { get; set; }
public double SalesRecProdPrice { get; set; }
public double SalesRecTotalPrice { get; set; }
}
并且我能够在 XAML 列表框中显示项目行。
<ListBox Name="listSalesRecord" Height="400" HorizontalAlignment="Left" Margin="0,5,0,0">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="18" VerticalAlignment="Top" >
<TextBlock Text="{Binding SalesRecID}" Margin="5,0,0,0" Width="30" FontSize="14"/>
<TextBlock Text="{Binding SalesRecDate}" Margin="5,0,0,0" Width="80" FontSize="14"/>
<TextBlock Text="{Binding SalesRecCustName}" Margin="5,0,0,0" Width="80" FontSize="14"/>
<TextBlock Text="{Binding SalesRecProdName}" Margin="5,0,0,0" Width="80" FontSize="14"/>
<TextBlock Text="{Binding SalesRecProdQty}" Margin="5,0,0,0" Width="60" FontSize="14"/>
<TextBlock Text="{Binding SalesRecProdPrice, Converter={StaticResource Converter}, ConverterParameter=\{0:0.00\}}" Margin="5,0,0,0" Width="60" FontSize="14"/>
<TextBlock Text="{Binding SalesRecTotalPrice, Converter={StaticResource Converter}, ConverterParameter=\{0:0.00\}}" Margin="5,0,0,0" Width="60" FontSize="14"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
使用以下日期范围查询。没有问题,因为我知道 yyyy-MM-dd
格式。
private void btnSearchRecordDateRange_Click(object sender, RoutedEventArgs e)
{
var searchDateRange = conn.Query<SalesRecord>("SELECT * FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" + tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')");
listSalesRecord.ItemsSource = searchDateRange;
}
但现在我想根据日期范围计算产品数量总和,我想使用相同的查询将其显示在文本框中,我所做的唯一更改是将 SELECT * FROM
替换为 SELECT SUM(SalesRecProdQty) FROM
.但是这个相同的查询字符串未能给我所需的总和。
private void btnSearchSumDateRange_Click(object sender, RoutedEventArgs e)
{
var searchSumProdQty = conn.Query<SalesRecord>("SELECT SUM(SalesRecProdQty) FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" + tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')");
tbxSearchQty.Text = searchSumProdQty.ToString();
}
我在文本框中收到此错误消息:
System.Collections.Generic.List`1[SalePad.Models.SalesRecord]
谁能告诉我哪里做错了。
SELECT *
有效,但 SELECT SUM(SalesRecProdQty)
失败,即使它们使用相同的查询字符串。
我正在使用 SQLite.Net-PCL 并且我在 WinRT 上使用 UWP,而不是 WPF。
抱歉给大家添麻烦了,不过我已经找到答案了
要获得 SUM(SalesRecProdQty)
你必须这样做
var searchdaterange = conn.Query<SalesRecord>("SELECT * FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('"+ tbxCDPFrom.Text + "') AND date('"+ tbxCDPTo.Text + "')");
var sumProdQty = searchdaterange.AsEnumerable().Sum(o => o.SalesRecProdQty);
tbxSearchQty.Text = sumProdQty.ToString();
如果有人能解释为什么我被迫使用 AsEnumerable.Sum(o => o.SalesRecProdQty);
背后的逻辑,我将不胜感激,因为原始语法可以在 SQL Fiddle 中运行,但它拒绝运行我的程序.
我在选择特定列时遇到了同样的问题,reader returns 没有行,这与我使用 sum() 时的情况相同。选择 * 适用于完全相同的查询,我的所有查询都适用于 DB Browser For SQLite,只是不适用于 c#。
在 C# 中使用 SQLite 时,您在查询中选择的列中需要一个索引列,例如
SELECT table.primaryKey, table.someOtherColumn FROM table
或者你的情况
SELECT salesRecord.primaryKey, SUM(SalesRecProdQty) FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" + tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')
选择 */all 的原因是因为它正在选择表的索引列。
晚上好,我有以下table
public class SalesRecord
{
[PrimaryKey, AutoIncrement]
public int SalesRecID { get; set; }
[Indexed]
public string SalesRecDate { get; set; }
public string SalesRecCustName { get; set; }
public string SalesRecProdName { get; set; }
public int SalesRecProdQty { get; set; }
public double SalesRecProdPrice { get; set; }
public double SalesRecTotalPrice { get; set; }
}
并且我能够在 XAML 列表框中显示项目行。
<ListBox Name="listSalesRecord" Height="400" HorizontalAlignment="Left" Margin="0,5,0,0">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="18" VerticalAlignment="Top" >
<TextBlock Text="{Binding SalesRecID}" Margin="5,0,0,0" Width="30" FontSize="14"/>
<TextBlock Text="{Binding SalesRecDate}" Margin="5,0,0,0" Width="80" FontSize="14"/>
<TextBlock Text="{Binding SalesRecCustName}" Margin="5,0,0,0" Width="80" FontSize="14"/>
<TextBlock Text="{Binding SalesRecProdName}" Margin="5,0,0,0" Width="80" FontSize="14"/>
<TextBlock Text="{Binding SalesRecProdQty}" Margin="5,0,0,0" Width="60" FontSize="14"/>
<TextBlock Text="{Binding SalesRecProdPrice, Converter={StaticResource Converter}, ConverterParameter=\{0:0.00\}}" Margin="5,0,0,0" Width="60" FontSize="14"/>
<TextBlock Text="{Binding SalesRecTotalPrice, Converter={StaticResource Converter}, ConverterParameter=\{0:0.00\}}" Margin="5,0,0,0" Width="60" FontSize="14"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
使用以下日期范围查询。没有问题,因为我知道 yyyy-MM-dd
格式。
private void btnSearchRecordDateRange_Click(object sender, RoutedEventArgs e)
{
var searchDateRange = conn.Query<SalesRecord>("SELECT * FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" + tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')");
listSalesRecord.ItemsSource = searchDateRange;
}
但现在我想根据日期范围计算产品数量总和,我想使用相同的查询将其显示在文本框中,我所做的唯一更改是将 SELECT * FROM
替换为 SELECT SUM(SalesRecProdQty) FROM
.但是这个相同的查询字符串未能给我所需的总和。
private void btnSearchSumDateRange_Click(object sender, RoutedEventArgs e)
{
var searchSumProdQty = conn.Query<SalesRecord>("SELECT SUM(SalesRecProdQty) FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" + tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')");
tbxSearchQty.Text = searchSumProdQty.ToString();
}
我在文本框中收到此错误消息:
System.Collections.Generic.List`1[SalePad.Models.SalesRecord]
谁能告诉我哪里做错了。
SELECT *
有效,但 SELECT SUM(SalesRecProdQty)
失败,即使它们使用相同的查询字符串。
我正在使用 SQLite.Net-PCL 并且我在 WinRT 上使用 UWP,而不是 WPF。
抱歉给大家添麻烦了,不过我已经找到答案了
要获得 SUM(SalesRecProdQty)
你必须这样做
var searchdaterange = conn.Query<SalesRecord>("SELECT * FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('"+ tbxCDPFrom.Text + "') AND date('"+ tbxCDPTo.Text + "')");
var sumProdQty = searchdaterange.AsEnumerable().Sum(o => o.SalesRecProdQty);
tbxSearchQty.Text = sumProdQty.ToString();
如果有人能解释为什么我被迫使用 AsEnumerable.Sum(o => o.SalesRecProdQty);
背后的逻辑,我将不胜感激,因为原始语法可以在 SQL Fiddle 中运行,但它拒绝运行我的程序.
我在选择特定列时遇到了同样的问题,reader returns 没有行,这与我使用 sum() 时的情况相同。选择 * 适用于完全相同的查询,我的所有查询都适用于 DB Browser For SQLite,只是不适用于 c#。
在 C# 中使用 SQLite 时,您在查询中选择的列中需要一个索引列,例如
SELECT table.primaryKey, table.someOtherColumn FROM table
或者你的情况
SELECT salesRecord.primaryKey, SUM(SalesRecProdQty) FROM SalesRecord WHERE date(SalesRecDate) BETWEEN date('" + tbxCDPFrom.Text + "') AND date('" + tbxCDPTo.Text + "')
选择 */all 的原因是因为它正在选择表的索引列。