2016-10-05 5 views
0

私は以下のmysqlクエリを持っています。私はどのカウンターが使われているのですか?私が3回Category Id 1を入力すると、カウンタは3になりますが、これは正しいですが、これで入力しなければ、別のcoloumnにはNOが来るはずです。 出力は、このKUと電気でmysqlクエリでカウンタを表示

 
     KU  Electrical 
Yes 6  2 
No 1  2 

である必要があり、私の販売チャネル名です。はいは、KUの腸内のカウンターと、入っていないノーの手段を意味します。これで助けてください。私は以下

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

カテゴリごとにグループ分けしています。つまり、カテゴリごとに1つの結果行が表示されます。これらの行のそれぞれに、カウントと販売チャネル名が表示されます。この販売チャネル名は、任意に選択されたカテゴリのレコードに含まれる名前の1つに過ぎません。

カテゴリや販売チャネルごとにカウントしたいとします。したがって句によってあなたのグループが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

この結果では、この組み合わせのためのトランザクションがないので、しかし、電気製品/カテゴリ2のエントリが表示されませんテーブル。これに対してゼロカウントを表示する場合は、最初に完全な結果セット(トランザクションがあるかどうかにかかわらず、チャネルとカテゴリのすべての組み合わせ)を作成する必要があります。あなたがここにクロスを追加し、参加参加の代わりに、内側の左Y http://sqlfiddle.com/#!9/60e998/5

+0

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のフィドル:次に、外側と思います取引に参加しますか?私たちは内部結合で必要な結果を得ることはできませんか?\ – sukh

+0

いいえ、SQLクエリは、そこにあるものだけを示すことができます。 Electricals/category 2の組み合わせのレコードがない場合は、それを表示するために作成する必要があります。これがクロス結合の役割です。あなたはクエリを試しましたか?あなたは結果の違いを見ますか?あなたは結果に満足していますか? –

+0

それは私に販売チャネル名を何度も与えている。カテゴリIDが6回追加された場合はKUが6回あります。複数のカウンターがそこにいます。 – sukh

関連する問題