添加循环以返回在SELECT查询中组合在一起的各个行

时间:2013-02-21 23:24:46

标签: sql loops group-by

我使用以下查询返回组合在一起的行:

SELECT Work, COUNT(*) AS count, Amount, SUM(Amount) AS Total FROM work_times GROUP BY Work, Amount

我想对此进行调整,以便我可以列出每个分组的各个日期以下分组数据。

所以如果我有下表:

ID |工作|金额|日期

1 |治疗会议| £40 | 2013年2月2日
2 |咨询会议| 50英镑| 2013年2月1日
3 |治疗会议| 20英镑| 2013年2月3日
4 |咨询会议| 50英镑| 2013年2月8日
5 |咨询会议| 50英镑| 2013年2月15日
6 |治疗会议| £40 | 2013年2月9日
7 |咨询会议| 50英镑| 2013年2月22日
8 |治疗会议| £40 | 2013年2月16日
9 |治疗会议| 20英镑| 2013年2月10日
10 |咨询会议| 50英镑| 2013-03-01

查询将能够返回:

5个咨询会议@每个50英镑:250英镑

2013年2月1日
2013年2月8日
2013年2月15日
2013年2月22日
2013年3月1日

3次治疗会议@每次40英镑:120英镑

2013年2月2日
2013年2月9日
2013年2月16日

2次治疗会议@每次20英镑:40英镑

2013年2月3日
2013年2月10日

因为我在查询中将行分组在一起,所以我不知道如何引用各行。

3 个答案:

答案 0 :(得分:1)

SELECT  b.*, c.date2
FROM    (
            SELECT  a.work, 
                    COUNT(*) totalCount, 
                    SUM(Amount) totalAmount
            FROM    tableName a
            GROUP   BY a.work, amount
        ) b
        INNER JOIN
        (
            SELECT  a.work, DATE_FORMAT(Date,'%D %M %Y') date2,
                    date
            FROM    tableName a
        ) c ON b.work = c.work
ORDER   BY b.work, b.totalCount, c.date

答案 1 :(得分:1)

以下代码是我对 JW 的回答的轻微修改:

SELECT  b.*, c.date2
FROM    (
            SELECT a.work, a.amount, 
                   COUNT(*) totalCount, 
                   SUM(Amount) totalAmount
            FROM tableName a
            GROUP BY a.work, a.amount
        ) b
        INNER JOIN
        (
            SELECT a.work, a.amount, DATE_FORMAT(Date,'%D %M %Y') date2,
                    date
            FROM tableName a
        ) c ON b.work = c.work and b.amount=c.amount
ORDER BY b.work, b.totalCount, c.date

我将金额添加到第一个子查询,第二个子查询和JOIN表达式。

希望此链接有效:http://sqlfiddle.com/#!2/e0ec1/24

答案 2 :(得分:0)

2个查询和一个UNION运算符应该提供您需要的格式。 SQL Fiddle


SELECT '' AS ID, Work, '' AS Date, Amount, SUM(Amount) AS Total
FROM TableName 
GROUP BY Work, Amount
UNION ALL
SELECT ID, Work, Date, Amount, '' AS Total
FROM TableName
ORDER BY Work, Amount, Date;