MySQL-使用默认值连接
我有来自MySql语句的标准数据MySQL-使用默认值连接,mysql,Mysql,我有来自MySql语句的标准数据 SELECT tipe.* FROM ( SELECT 'Menunggu Approve Atasan' AS tipe UNION SELECT 'Sudah Approved Atasan' UNION SELECT 'Dalam Proses Pengerjaan IT' UNION SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION
SELECT tipe.*
FROM
( SELECT 'Menunggu Approve Atasan' AS tipe UNION
SELECT 'Sudah Approved Atasan' UNION
SELECT 'Dalam Proses Pengerjaan IT' UNION
SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION
SELECT 'Ditutup'
) AS tipe;
+---------------------------------------+
| tipe |
+---------------------------------------+
| Menunggu Approve Atasan |
| Sudah Approved Atasan |
| Dalam Proses Pengerjaan IT |
| Sudah Selesai Tapi Belum Ditutup User |
| Ditutup |
+---------------------------------------+
5 rows in set (0.02 sec)
我有这样的数据
SELECT requests.*
FROM
( SELECT DATE(request.tanggal_permintaan) as tanggal_permintaan
, request.`status`
, COUNT(*) as total
FROM request
WHERE YEAR(request.tanggal_permintaan) = '2018'
GROUP
BY DATE(request.tanggal_permintaan)
, request.status
) AS requests;
+--------------------+---------------------------------------+-------+
| tanggal_permintaan | status | total |
+--------------------+---------------------------------------+-------+
| 2018-01-02 | Menunggu Approve Atasan | 1 |
| 2018-01-02 | Ditutup | 4 |
| 2018-01-03 | Ditutup | 1 |
+--------------------+---------------------------------------+-------+
3 rows in set (0.02 sec)
正如您可以看到的第二个查询的表单结果一样,它提供了基于日期的数据。但是,我需要在第二个查询中包含所有标准数据。
我需要这样的结果:
+--------------------+---------------------------------------+-------+
| tanggal_permintaan | status | total |
+--------------------+---------------------------------------+-------+
| 2018-01-02 | Menunggu Approve Atasan | 1 |
| 2018-01-02 | Sudah Approved Atasan | 0 |
| 2018-01-02 | Dalam Proses Pengerjaan IT | 0 |
| 2018-01-02 | Sudah Selesai Tapi Belum Ditutup User | 0 |
| 2018-01-02 | Ditutup | 4 | // one day
| 2018-01-03 | Menunggu Approve Atasan | 0 |
| 2018-01-03 | Sudah Approved Atasan | 0 |
| 2018-01-03 | Dalam Proses Pengerjaan IT | 0 |
| 2018-01-03 | Sudah Selesai Tapi Belum Ditutup User | 0 |
| 2018-01-03 | Ditutup | 1 | // one day
+--------------------+---------------------------------------+-------+
| date | tipe |
+--------------------+---------------------------------------+
| 2018-01-02 | Menunggu Approve Atasan |
| 2018-01-02 | Sudah Approved Atasan |
| 2018-01-02 | Dalam Proses Pengerjaan IT |
| 2018-01-02 | Sudah Selesai Tapi Belum Ditutup User |
| 2018-01-02 | Ditutup |
| 2018-01-03 | Menunggu Approve Atasan |
| 2018-01-03 | Sudah Approved Atasan |
| 2018-01-03 | Dalam Proses Pengerjaan IT |
| 2018-01-03 | Sudah Selesai Tapi Belum Ditutup User |
| 2018-01-03 | Ditutup |
我用什么查询得到这样的结果?
到目前为止,我只是尝试左外连接,但没有运气
SELECT requests.* FROM (
SELECT
DATE(request.tanggal_permintaan) as tanggal_permintaan,
request.`status`,
COUNT(*) as total
FROM request
WHERE YEAR(request.tanggal_permintaan) = '2018'
GROUP BY DATE(request.tanggal_permintaan), request.status
) requests
LEFT OUTER JOIN (
SELECT tipe.* FROM(
SELECT 'Menunggu Approve Atasan' AS tipe UNION
SELECT 'Sudah Approved Atasan' UNION
SELECT 'Dalam Proses Pengerjaan IT' UNION
SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION
SELECT 'Ditutup'
) tipe
)standard
ON standard.tipe = requests.status
ORDER BY requests.tanggal_permintaan
我们可以在派生表中获得2018年的所有唯一日期。数据上的Year函数不允许使用索引。我已将它改为在…之间使用。。这样它就可以使用索引了。
类似地,在单独的派生表中获取所有唯一状态。
在它们之间交叉连接以获得所有可能的组合。
现在,使用这个all_组合并左键连接到您的主查询(关于状态和日期),以获得所需的结果集。
请尝试以下操作:
SELECT all_combinations.tanggal_permintaan,
all_combinations.tipe,
COALESCE(requests.total, 0) AS total
FROM
(
SELECT all_tanggal_permintaan.tanggal_permintaan,
all_tipe.tipe
FROM
(SELECT DISTINCT DATE(tanggal_permintaan) as tanggal_permintaan
FROM request
WHERE tanggal_permintaan BETWEEN '2018-01-01 00:00:00' AND
'2018-12-31 23:59:59'
) AS all_tanggal_permintaan
CROSS JOIN
(SELECT 'Menunggu Approve Atasan' AS tipe UNION ALL
SELECT 'Sudah Approved Atasan' UNION ALL
SELECT 'Dalam Proses Pengerjaan IT' UNION ALL
SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION ALL
SELECT 'Ditutup'
) AS all_tipe
) AS all_combinations
LEFT OUTER JOIN
(
SELECT
DATE(tanggal_permintaan) as tanggal_permintaan,
status,
COUNT(*) AS total
FROM request
WHERE tanggal_permintaan BETWEEN '2018-01-01 00:00:00' AND
'2018-12-31 23:59:59'
GROUP BY DATE(tanggal_permintaan), status
) AS requests
ON requests.tanggal_permintaan = all_combinations.tanggal_permintaan AND
requests.status = all_combinations.tipe
ORDER BY all_combinations.tanggal_permintaan
这是一个猜测,但您似乎需要一个状态值列表,这让我感到惊讶,它还没有在表中,但这可能会起作用:
SELECT
g.tanggal_permintaan, g.total, s.status
FROM (
SELECT DISTINCT
request.status
FROM request
) s
LEFT JOIN (
SELECT
DATE(request.tanggal_permintaan) AS tanggal_permintaan
,request.status
,COUNT(*) AS total
FROM request
WHERE request.tanggal_permintaan) >= '20180101'
AND request.tanggal_permintaan) < '20190101'
GROUP BY
DATE(request.tanggal_permintaan)
,request.status
) g
ON s.status = g.status
要获得该输出,您需要创建tipe值与请求表中每个不同日期的交叉联接: 这将为您提供一个如下所示的表:
+--------------------+---------------------------------------+-------+
| tanggal_permintaan | status | total |
+--------------------+---------------------------------------+-------+
| 2018-01-02 | Menunggu Approve Atasan | 1 |
| 2018-01-02 | Sudah Approved Atasan | 0 |
| 2018-01-02 | Dalam Proses Pengerjaan IT | 0 |
| 2018-01-02 | Sudah Selesai Tapi Belum Ditutup User | 0 |
| 2018-01-02 | Ditutup | 4 | // one day
| 2018-01-03 | Menunggu Approve Atasan | 0 |
| 2018-01-03 | Sudah Approved Atasan | 0 |
| 2018-01-03 | Dalam Proses Pengerjaan IT | 0 |
| 2018-01-03 | Sudah Selesai Tapi Belum Ditutup User | 0 |
| 2018-01-03 | Ditutup | 1 | // one day
+--------------------+---------------------------------------+-------+
| date | tipe |
+--------------------+---------------------------------------+
| 2018-01-02 | Menunggu Approve Atasan |
| 2018-01-02 | Sudah Approved Atasan |
| 2018-01-02 | Dalam Proses Pengerjaan IT |
| 2018-01-02 | Sudah Selesai Tapi Belum Ditutup User |
| 2018-01-02 | Ditutup |
| 2018-01-03 | Menunggu Approve Atasan |
| 2018-01-03 | Sudah Approved Atasan |
| 2018-01-03 | Dalam Proses Pengerjaan IT |
| 2018-01-03 | Sudah Selesai Tapi Belum Ditutup User |
| 2018-01-03 | Ditutup |
然后,您可以将其左键连接到请求表,以获得所需的结果:
SELECT s.date, s.tipe, COUNT(*) AS total
FROM (SELECT r.date, t.tipe
FROM (SELECT 'Menunggu Approve Atasan' AS tipe UNION
SELECT 'Sudah Approved Atasan' UNION
SELECT 'Dalam Proses Pengerjaan IT' UNION
SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION
SELECT 'Ditutup'
) t
CROSS JOIN
(SELECT DISTINCT DATE(tanggal_permintaan) AS date
FROM request
WHERE YEAR(tanggal_permintaan) = 2018) r
) s
LEFT JOIN request rq ON rq.status = s.tipe
GROUP BY s.date, s.tipe
谢谢你的兄弟尼克和你已经用过的 这是我的最后一个问题。 我创建了一个基于唯一id的concat,通过左连接将它们连接起来
SELECT standard.*, transactions.* FROM (
SELECT CONCAT(r.date, '#', t.tipe) as 'id', r.date AS tanggal_permintaan, t.tipe
FROM (
SELECT DISTINCT
request.status AS tipe
FROM request
) t
CROSS JOIN (
SELECT DISTINCT DATE(tanggal_permintaan) AS date
FROM request
WHERE YEAR(request.tanggal_permintaan) = '2018'
) r
) AS standard
LEFT JOIN (
SELECT CONCAT(requests.tanggal_permintaan, '#' , requests.status) AS 'id', requests.tanggal_permintaan, requests.status, requests.total
FROM (
SELECT
DATE(request.tanggal_permintaan) as tanggal_permintaan,
request.`status`,
COUNT(*) as total
FROM request
WHERE YEAR(request.tanggal_permintaan) = '2018'
GROUP BY DATE(request.tanggal_permintaan), request.status
) requests
) AS transactions
ON transactions.id = standard.id
ORDER BY standard.id
对不起,兄弟,这不管用。仍然默认列表未加载OK,我建议您尝试Nick的查询。但请避免在日期列上使用函数,如YEARrequest.tanggal_permintaan='2018'请参见上面的查询。也基本上看你给我一个启示。谢谢