在堆栈上有一个答案我使用了以下查询:
select
AVG(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Market_Rate ELSE 0 END) AS AVGBuyRate ,
AVG(CASE WHEN Buy_sell = 2 THEN Market_Rate ELSE 0 END) AS AVGSellRate,
CONVERT(VARCHAR(11),sauda_date) AS sauda_date,
SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Trade_Qty ELSE 0 END) AS BuyQty,
SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Trade_Qty ELSE 0 END) AS SellQty ,
SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) -SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) AS CarryForword
from tradefile
where scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "'
and INST_TYPE LIKE 'FUT%'
group by CONVERT(VARCHAR(11),sauda_date) order by CONVERT(VARCHAR(11),sauda_date) desc
此查询为我提供以下输出:
如果我们看看sauda_date专栏,在2013年2月28日之后,它将在2013年3月22日,2013年3月21日,2013年3月20日等订购。
但应该是2013年2月28日,2013年3月1日,2013年3月2日....,2013年3月20日,2013年3月21日,2013年3月22日。
我应该在查询中做出哪些更改?
注意: sauda_date属于nvarchar类型
NEW QUERY:
select AVG(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Market_Rate ELSE 0 END) AS AVGBuyRate , AVG(CASE WHEN Buy_sell = 2 THEN Market_Rate ELSE 0 END) AS AVGSellRate, CONVERT(VARCHAR, CONVERT(DATETIME, sauda_date, 106), 106) as Sauda_Date,SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "') and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "') THEN Trade_Qty ELSE 0 END) AS BuyQty,SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and Sauda_Date between convert(datetime,'" + dtpForDate.Value.Date.ToString("dd/MM/yyyy") + "',106) and convert(datetime,'" + dtpToDate.Value.Date.ToString("dd/MM/yyyy") + "',106) THEN Trade_Qty ELSE 0 END) AS SellQty , SUM(CASE WHEN Buy_sell = 1 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) -SUM(CASE WHEN Buy_sell = 2 and scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' THEN Trade_Qty ELSE 0 END) AS CarryForword from tradefile where scrip_code='" + ds.Tables[0].Rows[i][2].ToString() + "' and INST_TYPE LIKE 'FUT%' group by convert(datetime,sauda_date,106) order by convert(datetime,sauda_date,106) desc
答案 0 :(得分:4)
您正在将日期转换为文本以进行排序,因此您可以获得文本顺序。 “F”出现在“M”之前。我不知道我会说的架构:尝试从CONVERT...
子句删除ORDER BY
调用。
此外,您似乎需要ASC
订单,而不是DESC
。
编辑:你说sauda_date是nvarchar
类型。我要说它不应该是(使用适当的日期类型进行存储),或者你必须将它转换回日期时间进行排序。
答案 1 :(得分:1)
将最后一行更改为:
select
....,
CONVERT(VARCHAR, CONVERT(DATETIME, sauda_date, 106), 106)
...
group by CONVERT(VARCHAR, CONVERT(DATETIME, sauda_date, 106), 106)
order by CONVERT(DATETIME, sauda_date, 106) asc
此外,您首先需要最低的日期,因此我认为您需要asc
而不是desc