![](/img/trans.png)
[英]#1222 - The used SELECT statements have a different number of columns
[英]Mysql shows #1222 - The used SELECT statements have a different number of columns
有兩個表(1)銷售和(2)銷售項目。 sale_item表如下:
id|sale_id|product|quantity|real_unit_price|
prod_type|food_sgst|liquor_sgst|food_cgst|liquor_cgst|food_igst|liquor_igst|item_sc
1 | 10000|XX1|02|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
2 | 10000|XX2|03|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
3 | 10000|XX3|02|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
4 | 10000|XX4|07|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
5 | 10001|XXX|02|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
6 | 10002|XX4|02|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
7 | 10002|XX5|02|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
8 | 10002|XX5|02|100.00|0|7.25|0.00|7.25|0.00|0.00|0.00|4.0
銷售表如下:
id|date|customer_name|total_discount
10000|2019-02-19|YYYY|20
10001|2019-02-19|YYYY|10
10002|2019-02-19|YYYY|20
在上面的示例中,您在一個賬單中出售了4個項目(銷售ID 10000),並對總賬單進行了折扣。 所有項目將存儲在銷售項目表中,而帳單明細將存儲在銷售表中。我編寫了一個SQL查詢。 如果我使用以下sql查詢:
SELECT sales.id as sale_id, DATE_FORMAT(sales.date, '%e' ) AS date,SUM( (line.quantity)*(line.real_unit_price) ) AS amt, SUM(line.food_sgst+line.liquor_sgst) AS sgst, SUM(line.food_cgst+line.liquor_cgst) AS cgst, SUM(line.food_igst+line.liquor_igst) AS igst, SUM(line.item_sc) AS i_sc, SUM( DISTINCT( total_discount) ) AS discount, SUM(((line.quantity)*(line.real_unit_price))+(line.food_sgst+line.liquor_sgst)+(line.food_cgst+line.liquor_cgst)+(line.food_igst+line.liquor_igst)+line.item_sc) AS total FROM sale_items as line LEFT JOIN sales as sales ON line.sale_id = sales.id WHERE created_by = 17 AND DATE_FORMAT(date, '%Y-%m') = '2019-02' GROUP BY DATE_FORMAT( date, '%e')
那么問題是,不同銷售標識中的相同折扣金額未返回正確的值。 假設有4個銷售ID。 100,101,102和103,折扣分別為$ 10,$ 10,$ 15和$ 10。 因此總折扣為$ 45。 但它僅顯示$ 25。 為避免此問題,請編寫查詢,如下所示:
select * from (
(SELECT sales.id as sale_id, DATE_FORMAT(sales.date, '%e' ) AS date,SUM( (line.quantity)*(line.real_unit_price) ) AS amt, SUM(line.food_sgst+line.liquor_sgst) AS sgst, SUM(line.food_cgst+line.liquor_cgst) AS cgst, SUM(line.food_igst+line.liquor_igst) AS igst, SUM(line.item_sc) AS i_sc, SUM(((line.quantity)*(line.real_unit_price))+(line.food_sgst+line.liquor_sgst)+(line.food_cgst+line.liquor_cgst)+(line.food_igst+line.liquor_igst)+line.item_sc) AS total FROM sale_items as line LEFT JOIN sales as sales ON line.sale_id = sales.id WHERE created_by = 17 AND DATE_FORMAT(date, '%Y-%m') = '2019-02' GROUP BY DATE_FORMAT( date, '%e')
)union all(
SELECT SUM(a.total_discount) as total_discount from sales a where DATE_FORMAT(a.date, '%Y-%m' ) = '2019-02' GROUP BY DATE_FORMAT(a.date, '%e' ) order by a.id)
)as salesall
顯示錯誤
1222-使用的SELECT語句具有不同數量的列。
請幫我解決這個問題。
您應該為UNION/UNION ALL
使用相同數量的列
SELECT sales.id as sale_id, DATE_FORMAT(sales.date, '%e' ) AS date,SUM( (line.quantity)*(line.real_unit_price) ) AS amt, SUM(line.food_sgst+line.liquor_sgst) AS sgst, SUM(line.food_cgst+line.liquor_cgst) AS cgst,
SUM(line.food_igst+line.liquor_igst) AS igst,
SUM(line.item_sc) AS i_sc, SUM( DISTINCT( total_discount) ) AS discount, SUM(((line.quantity)*(line.real_unit_price))+(line.food_sgst+line.liquor_sgst)+(line.food_cgst+line.liquor_cgst)+(line.food_igst+line.liquor_igst)+line.item_sc) AS total
FROM sale_items as line LEFT JOIN sales as sales ON line.sale_id = sales.id WHERE created_by = 17 AND DATE_FORMAT(date, '%Y-%m') = '2019-02'
GROUP BY DATE_FORMAT( date, '%e')
union all
SELECT null,null,null,null,null,null,null,null,SUM(a.total_discount) as total_discount
from sales a where DATE_FORMAT(a.date, '%Y-%m' ) = '2019-02'
GROUP BY DATE_FORMAT(a.date, '%e' ) order by a.id
根據您的樣本數據和查詢,我想您希望每天返回1行
drop table if exists t,t1;
create table t
(id int,sale_id int,product varchar(3),quantity int,real_unit_price decimal(10,2),
prod_type int, food_sgst decimal(10,2),liquor_sgst decimal(10,2),food_cgst decimal(10,2),liquor_cgst decimal(10,2),
food_igst decimal(10,2),liquor_igst decimal(10,2),item_sc decimal(10,2));
insert into t values
(1 , 10000,'XX1',02,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0),
(2 , 10000,'XX2',03,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0),
(3 , 10000,'XX3',02,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0),
(4 , 10000,'XX4',07,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0),
(5 , 10001,'XXX',02,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0),
(6 , 10002,'XX4',02,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0),
(7 , 10002,'XX5',02,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0),
(8 , 10002,'XX5',02,100.00,0,7.25,0.00,7.25,0.00,0.00,0.00,4.0);
create table t1
(id int,date date,customer_name varchar(4),total_discount int);
insert into t1 values
(10000,'2019-02-19','YYYY',20),
(10001,'2019-02-19','YYYY',10),
(10002,'2019-02-19','YYYY',20);
在這種情況下,將兩個表分別匯總並合並結果
select b.*,a.total_discount
from
(
select DATE_FORMAT(sales.date, '%e' ) dt, sum(total_discount) total_discount
from t1 sales
group by DATE_FORMAT(sales.date, '%e' )
) a
left join
(
select DATE_FORMAT(sales.date, '%e' ) AS date,
SUM( (line.quantity)*(line.real_unit_price) ) AS amt,
SUM(line.food_sgst+line.liquor_sgst) AS sgst,
SUM(line.food_cgst+line.liquor_cgst) AS cgst,
SUM(line.food_igst+line.liquor_igst) AS igst,
SUM(line.item_sc) AS i_sc,
SUM(((line.quantity)*(line.real_unit_price))+(line.food_sgst+line.liquor_sgst)+(line.food_cgst+line.liquor_cgst)+(line.food_igst+line.liquor_igst)+line.item_sc) AS total
FROM t as line
left join t1 as sales on line.sale_id = sales.id
group by DATE_FORMAT(sales.date, '%e' )
) b
on a.dt = b.date;
+------+---------+-------+-------+------+-------+---------+----------------+
| date | amt | sgst | cgst | igst | i_sc | total | total_discount |
+------+---------+-------+-------+------+-------+---------+----------------+
| 19 | 2200.00 | 58.00 | 58.00 | 0.00 | 32.00 | 2348.00 | 50 |
+------+---------+-------+-------+------+-------+---------+----------------+
1 row in set (0.00 sec)
除非您只有1個月的數據量,否則按行進行聚合看起來很危險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.