none
LinQ查询的问题(分组) RRS feed

  • 问题

  • 是这样的,
    现在我有一个数据表,结构大致如下:
    ----------------------------------------------------------------
    日期|   列1(币种)|   列2|  列3(币种)|  列4|  列3|  列4

    其中列1和列3是同样的已知的枚举内容,例如都是车辆型号,或者都是货币币种

    那么:
    1.如何设计一个LinQ查询列1和列3中出现的数据(且不重复)?
    查询出类似如下结果:
    出现的币种
    人民币
    美元
    英镑
    ……
    对于单一列的分组可以实现这个效果,但是对于两列或者以上的数据如何写Linq语句呢?

    2.如何设计一个LinQ查询分组实现多层的分组?
    查询出类似如下结果:
    5月1日===========================
              人民币=======================
                        计数       |          汇总金额
              美元========================
                        计数       |          汇总金额
              英镑========================
                        计数       |          汇总金额
              ……
    5月2日===========================
              人民币=======================
                        计数       |          汇总金额
              美元========================
                        计数       |          汇总金额
              英镑========================
                        计数       |          汇总金额
              ……
    ……


    在问问题之前,我已经查阅了Msdn的帮助说明,关于LinQ的介绍的例子似乎比较简单,弄了半天还是没解决问题,只好请教各位了:)
    谢谢:)
    编程是永无止境的,向大家学习
    2009年4月4日 3:47

答案

  • 我的看法是

    1. 该数据表是不是应该考虑改变设计。列1和列3都表示币种的话,是不是应该合并为1列。
    2. 如果合并为1列了,则可以直接解决。
    3. 至于如何在分组后,输出统计结果。在T-SQL中可以直接使用ROLLUP或者CUBE关键字。

    即便是不改表结构,例如还是如下的结果
    CREATE TABLE [dbo].[Test](
    [日期] [datetime] NULL,
    [币种1] [nchar](10) NULL,
    [金额1] [decimal](18, 0) NULL,
    [币种2] [nchar](10) NULL,
    [金额2] [decimal](18, 0) NULL
    ) ON [PRIMARY]

    还是可以通过先将其转变为我们需要的结构,然后做Group的

    SELECT 日期,币种,SUM(金额) FROM 
    (SELECT 日期,币种1 AS 币种,金额1 AS 金额 FROM TEST
    UNION ALL
    SELECT 日期,币种2,金额2 FROM TEST) AS P
    GROUP BY 日期,币种
    WITH ROLLUP
    ORDER BY 日期,币种


    大致的查询结果是
    日期                      币种         
    ----------------------- ---------- ---------------------------------------
    NULL                    NULL       75000
    2009-01-01 00:00:00.000 NULL       9000
    2009-01-01 00:00:00.000 美元         2000
    2009-01-01 00:00:00.000 人民币        4000
    2009-01-01 00:00:00.000 日元         3000
    2009-01-02 00:00:00.000 NULL       23000
    2009-01-02 00:00:00.000 美元         20000
    2009-01-02 00:00:00.000 人民币        3000
    2009-01-03 00:00:00.000 NULL       43000
    2009-01-03 00:00:00.000 欧元         40000
    2009-01-03 00:00:00.000 人民币        3000

    【这里不能截图,请自己运行脚本测试一下】

    我的观点是,有些东西应该在数据库这一层就处理好,善用LINQ,呵呵

    2009年5月19日 23:02

全部回复

  • 1.from rs in (from it in table select new {列x=列1,列1,列2,列3,列4} ).Union(from it in table select new {列x=列3,列1,列2,列3,列4}) group rs by rs.列x into g select ....
    2.子查询
    2009年5月19日 8:26
  • 我的看法是

    1. 该数据表是不是应该考虑改变设计。列1和列3都表示币种的话,是不是应该合并为1列。
    2. 如果合并为1列了,则可以直接解决。
    3. 至于如何在分组后,输出统计结果。在T-SQL中可以直接使用ROLLUP或者CUBE关键字。

    即便是不改表结构,例如还是如下的结果
    CREATE TABLE [dbo].[Test](
    [日期] [datetime] NULL,
    [币种1] [nchar](10) NULL,
    [金额1] [decimal](18, 0) NULL,
    [币种2] [nchar](10) NULL,
    [金额2] [decimal](18, 0) NULL
    ) ON [PRIMARY]

    还是可以通过先将其转变为我们需要的结构,然后做Group的

    SELECT 日期,币种,SUM(金额) FROM 
    (SELECT 日期,币种1 AS 币种,金额1 AS 金额 FROM TEST
    UNION ALL
    SELECT 日期,币种2,金额2 FROM TEST) AS P
    GROUP BY 日期,币种
    WITH ROLLUP
    ORDER BY 日期,币种


    大致的查询结果是
    日期                      币种         
    ----------------------- ---------- ---------------------------------------
    NULL                    NULL       75000
    2009-01-01 00:00:00.000 NULL       9000
    2009-01-01 00:00:00.000 美元         2000
    2009-01-01 00:00:00.000 人民币        4000
    2009-01-01 00:00:00.000 日元         3000
    2009-01-02 00:00:00.000 NULL       23000
    2009-01-02 00:00:00.000 美元         20000
    2009-01-02 00:00:00.000 人民币        3000
    2009-01-03 00:00:00.000 NULL       43000
    2009-01-03 00:00:00.000 欧元         40000
    2009-01-03 00:00:00.000 人民币        3000

    【这里不能截图,请自己运行脚本测试一下】

    我的观点是,有些东西应该在数据库这一层就处理好,善用LINQ,呵呵

    2009年5月19日 23:02