2016-10-05 55 views
0

我有下面給出的mysql查詢。我使用了哪個櫃檯。如果我輸入類別id 1 3次然後計數器即將3這是正確的,但與此我想如果我不進入然後不同coloumn應該來與否。 輸出應該在mysql查詢中顯示計數器

 
     KU  Electrical 
Yes 6  2 
No 1  2 

在這種KU電氣是我的銷售渠道的名字。是表示KU的輸入計數器,No表示沒有輸入的計數器。請幫忙。下面我奮力

select 
    SalesChannel.name, 
    Transaction.category_id, 
    count(Transaction.category_id) as "count" 
from outlets Outlet 
inner join transactions Transaction on Outlet.id = Transaction.outlet_id 
inner join sale_channels SalesChannel on SalesChannel.id = Outlet.sale_channel_id 
group by Transaction.category_id; 

是我使用

1)交易

CREATE TABLE IF NOT EXISTS `transactions` (
`id` int(11) NOT NULL, 
    `zone_id` int(11) NOT NULL, 
    `state_id` int(11) NOT NULL, 
    `city_id` int(11) NOT NULL, 
    `category_id` int(11) NOT NULL, 
    `sub_category_id` int(11) NOT NULL, 
    `brand_id` int(11) NOT NULL, 
    `model_id` int(11) NOT NULL, 
    `outlet_id` int(11) NOT NULL, 
    `no_of_units` int(11) NOT NULL, 
    `mop` decimal(10,2) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `transactions` 
-- 

INSERT INTO `transactions` (`id`, `zone_id`, `state_id`, `city_id`, `category_id`, `sub_category_id`, `brand_id`, `model_id`, `outlet_id`, `no_of_units`, `mop`) VALUES 
(1, 2, 2, 2, 2, 1, 1, 1, 1, 3, '6.00'), 
(2, 2, 2, 2, 2, 1, 1, 1, 1, 3, '6.00'), 
(3, 1, 1, 1, 1, 1, 1, 1, 1, 4, '2.00'), 
(4, 2, 2, 2, 1, 1, 1, 1, 2, 4, '2.00'); 

2)網點

CREATE TABLE IF NOT EXISTS `outlets` (
`id` int(11) NOT NULL, 
    `outlet_code` varchar(255) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `zone_id` int(11) NOT NULL, 
    `state_id` int(11) NOT NULL, 
    `city_id` int(11) NOT NULL, 
    `sale_channel_id` int(11) NOT NULL, 
    `is_active` tinyint(1) NOT NULL, 
    `created` datetime NOT NULL, 
    `modified` datetime NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `outlets` 
-- 

INSERT INTO `outlets` (`id`, `outlet_code`, `name`, `zone_id`, `state_id`, `city_id`, `sale_channel_id`, `is_active`, `created`, `modified`) VALUES 
(1, '1508', 'Ashok electricals', 2, 2, 2, 1, 1, '2016-10-03 00:00:00', '2016-10-03 00:00:00'), 
(2, '1233', 'vinayak electricals', 1, 1, 1, 2, 1, '2016-10-04 00:00:00', '2016-10-04 00:00:00'); 

3)sale_chennals三個表

CREATE TABLE IF NOT EXISTS `sale_channels` (
`id` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `is_active` tinyint(1) NOT NULL, 
    `created` datetime NOT NULL, 
    `modified` datetime NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `sale_channels` 
-- 

INSERT INTO `sale_channels` (`id`, `name`, `is_active`, `created`, `modified`) VALUES 
(1, 'KU', 1, '2016-10-03 00:00:00', '2016-10-03 00:00:00'), 
(2, 'Electricals', 1, '2016-10-04 00:00:00', '2016-10-04 00:00:00'); 

SQL小提琴:http://sqlfiddle.com/#!9/3f497/1

回答

0

您正在按類別分組。這意味着每個類別都有一個結果行。在每一行中,您都會顯示計數和銷售渠道名稱。此銷售渠道名稱只是任意選擇的類別記錄中找到的名稱之一。

我想你要計算每個類別和銷售渠道。因此,您的group by子句應該是group by SalesChannel.name, Transaction.category_id

select 
    SalesChannel.name, 
    Transaction.category_id, 
    count(Transaction.category_id) as "count" 
from outlets Outlet 
inner join transactions Transaction on Outlet.id = Transaction.outlet_id 
inner join sale_channels SalesChannel on SalesChannel.id = Outlet.sale_channel_id 
group by SalesChannel.name, Transaction.category_id; 

SQL小提琴:http://sqlfiddle.com/#!9/3f497/2

這樣的結果,但是,不顯示ELECTRICALS/2類的條目,因爲這個組合中沒有交易桌子。如果您想爲此顯示零計數,您必須首先創建完整的結果集(即通道和類別的所有組合,無論它們是否具有交易)。然後你會外連接的事務:

select 
    sc.name, 
    c.id as category_id, 
    count(t.id) as "count" 
from sale_channels sc 
cross join categories c 
left join outlets o on o.sale_channel_id = sc.id 
left join transactions t on t.outlet_id = o.id and t.category_id = c.id 
group by sc.name, c.id; 

SQL小提琴:http://sqlfiddle.com/#!9/60e998/5

+0

y您加入這裏的十字架,左的連接,而不是內部聯接?不能我們得到所需的內部連接的結果?\ – sukh

+0

沒有。一個SQL查詢只能顯示那裏有什麼。當組合電器/類別2沒有記錄時,我們必須創建它才能顯示它。這就是交叉連接所做的。你有沒有試過這些查詢?你看到結果的差異嗎?你對結果滿意嗎? –

+0

其多次給我銷售渠道名稱。如果6次添加類別ID,應該有6次KU。有多個櫃檯在那裏。 – sukh