2016-08-31 2 views
2

Я хочу показать данные отдельно от таблицы доходов и расходов в MySQL, используя один и тот же запрос для обеих вещей, но покажет мне, когда указывается дата дохода дохода, а затем та же дата выпуска названия счета. Но мне нужно сделать, если он найдет 4-й ряд таблицы доходов, а если найдет таблицу расходов 2-го ряда, но он покажет мне 4-ю строку. Зачем?Как решить нулевое значение в MySQL?

SELECT income.date, 
     IF(income.income_sourch IS NULL, 'N/A', income.income_sourch)as 'Income Title', 
     income.amount as 'income', 
     IF(expense.expense_sourche IS NULL, 'N/A', expense.expense_sourche) as 'ExpenseTitle', 
     expense.amount as 'Expense' 
from expense RIGHT JOIN income 
    ON expense.date=income.date 
where expense.date='30-Aug-2016' 

enter image description here

+0

Мне нужно, когда fin d данные из доходов и расходов, то не дублируйте value.please help me – Nurkarim

+0

Я читал ваш вопрос, как 10 раз, и не понимаю, что вы просите. Можете ли вы добавить результат, который хотите получить (в обоих случаях один раз с 2, один раз с 4 строками), хотя я не думаю, что то, что вы спрашиваете, возможно (если я предполагаю, что это правильно). – Solarflare

ответ

0

вам просто нужно добавить ограничения в запросе

если предел расходов таблица 2 если другой предел 4

Посмотрите, как добавить ограничение на запрос с условием, если условие

+0

Я не совсем уверен, что вы имеете в виду, но такой команды нет. – Solarflare

2

Почему - потому что так работают соединения, когда у вас есть только дата, чтобы присоединиться к двум таблицам. Чтобы решить эту проблему, вам необходимо создать отношения в дополнение к дате с учетом того, что в любой момент количество записей в доходе может быть больше, чем или меньше количества записей в расходах. Если мы генерируем номер строки для каждой строки в доходах и самостоятельно генерировать номер строки для каждой строки в расходах, то мы можем объединить доходы и расходы по строке числа , например

/* 
CREATE TABLE INCOME (ID INT,DESCRIPTION VARCHAR(10),DT DATE,AMOUNT INT); 
INSERT INTO INCOME VALUES 
(1,'SALE','2016-08-30',100), 
(2,'ROKY','2016-08-30',200), 
(3,'KORIM','2016-08-30',300), 
(4,'SALEVOUCHR','2016-08-30',400); 
CREATE TABLE EXPENSES (ID INT,DESCRIPTION VARCHAR(10),DT DATE,AMOUNT INT); 
TRUNCATE TABLE EXPENSES; 
INSERT INTO EXPENSES VALUES 
(1,'RENT','2016-08-30',100), 
(2,'UTILITIES','2016-08-30',100); 
/* 

Этот код

SELECT S.DT,S.DESCRIPTION,S.AMOUNT, s.rn,T.DESCRIPTION,T.AMOUNT, t.rn1 
FROM 
(
SELECT I.DT,I.DESCRIPTION,I.AMOUNT, 
      @RN:[email protected] + 1 RN 
FROM  (SELECT @RN:=0) RN,INCOME I 
) S 
LEFT OUTER JOIN 
(SELECT E.DT,E.DESCRIPTION,E.AMOUNT, 
      @RN1:[email protected] + 1 RN1 
FROM  (SELECT @RN1:=0) RN1, EXPENSES E 
) T ON T.RN1 = S.RN AND T.DT = S.DT 
WHERE S.DT IS NOT NULL 

результатов в

+------------+-------------+--------+------+-------------+--------+------+ 
| DT   | DESCRIPTION | AMOUNT | rn | DESCRIPTION | AMOUNT | rn1 | 
+------------+-------------+--------+------+-------------+--------+------+ 
| 2016-08-30 | SALE  | 100 | 1 | RENT  | 100 | 1 | 
| 2016-08-30 | ROKY  | 200 | 2 | UTILITIES | 100 | 2 | 
| 2016-08-30 | KORIM  | 300 | 3 | NULL  | NULL | NULL | 
| 2016-08-30 | SALEVOUCHR | 400 | 4 | NULL  | NULL | NULL | 
+------------+-------------+--------+------+-------------+--------+------+ 

но это небезопасно, поскольку он предполагает, что всегда есть больше дохода, чем статьи расходов Fo г пример, если мы добавим еще 3 расходов строки

TRUNCATE TABLE EXPENSES; 
INSERT INTO EXPENSES VALUES 
(1,'RENT','2016-08-30',100), 
(2,'UTILITIES','2016-08-30',100), 
(3,'RATES','2016-08-30',100),(4,'SALARY','2016-08-30',100),(5,'INSURANCE','2016-08-30',100); 

то последний пункт расходов теряется в результате

+------------+-------------+--------+------+-------------+--------+------+ 
| DT   | DESCRIPTION | AMOUNT | rn | DESCRIPTION | AMOUNT | rn1 | 
+------------+-------------+--------+------+-------------+--------+------+ 
| 2016-08-30 | SALE  | 100 | 1 | RENT  | 100 | 1 | 
| 2016-08-30 | ROKY  | 200 | 2 | UTILITIES | 100 | 2 | 
| 2016-08-30 | KORIM  | 300 | 3 | RENT  | 100 | 3 | 
| 2016-08-30 | SALEVOUCHR | 400 | 4 | UTILITIES | 100 | 4 | 
+------------+-------------+--------+------+-------------+--------+------+ 

Чтобы справиться с этим, мы можем моделировать полный присоединиться как и

SELECT S.*,T.* 
FROM 
(
SELECT I.DT,I.DESCRIPTION,I.AMOUNT, 
      @RN:[email protected] + 1 RN 
FROM  (SELECT @RN:=0) RN,INCOME I 
) S 
LEFT JOIN 
(SELECT E.DT,E.DESCRIPTION,E.AMOUNT, 
      @RN1:[email protected] + 1 RN1 
FROM  (SELECT @RN1:=0) RN1, EXPENSES E 
) T ON T.RN1 = S.RN AND T.DT = S.DT 

UNION 

SELECT S.*,T.* 
FROM 
(
SELECT I.DT,I.DESCRIPTION,I.AMOUNT, 
      @RN3:[email protected] + 1 RN3 
FROM  (SELECT @RN3:=0) RN3,INCOME I 
) S 
RIGHT JOIN 
(SELECT E.DT,E.DESCRIPTION,E.AMOUNT, 
      @RN4:[email protected] + 1 RN4 
FROM  (SELECT @RN4:=0) RN4, EXPENSES E 
) T ON T.RN4 = S.RN3 AND T.DT = S.DT 

+------------+-------------+--------+------+------------+-------------+--------+------+ 
| DT   | DESCRIPTION | AMOUNT | RN | DT   | DESCRIPTION | AMOUNT | RN1 | 
+------------+-------------+--------+------+------------+-------------+--------+------+ 
| 2016-08-30 | SALE  | 100 | 1 | 2016-08-30 | RENT  | 100 | 1 | 
| 2016-08-30 | ROKY  | 200 | 2 | 2016-08-30 | UTILITIES | 100 | 2 | 
| 2016-08-30 | KORIM  | 300 | 3 | 2016-08-30 | RATES  | 100 | 3 | 
| 2016-08-30 | SALEVOUCHR | 400 | 4 | 2016-08-30 | SALARY  | 100 | 4 | 
| NULL  | NULL  | NULL | NULL | 2016-08-30 | INSURANCE | 100 | 5 | 
+------------+-------------+--------+------+------------+-------------+--------+------+ 
+0

спасибо брату за этот решаемый путь – Nurkarim

+0

Большое вам спасибо за вашу работу help.it. брат, почему бы не работать, где clause.i нужно, когда я нахожу ссылку на данные Date.can я могу просмотреть таблицу? – Nurkarim

+1

Извините, я не понимаю ваш комментарий, вы можете перефразировать или дать мне пример? –