4

Pythonスクリプトの作成に着手する前に、MySQLだけで結果が得られるかどうかを確認したいと思います。

私は製品のリストを持っています:

PID Product 
-----------
1   AAA
2   ABC
3   BAC
4   CAB
5   CBA

これらの製品を数回注文している会社のリストがあります:

CID PID
-------
1   1
2   3
1   5
3   2
1   1
2   3 

望ましい結果:

CID AAA ABC BAC CAB CAB CBA
---------------------------
1   Y                   Y
2           Y
3       Y  

Pythonでこれをどのように行うのですか?

  • 列を含む一時テーブルを作成します(CID AAA ABC BAC CAB CAB CBA)
  • 2つのループを実行し、目的の列が一致したときに目的のテーブルを更新します。

MySQLのみのソリューションが存在するかどうかを知りたいだけです。

ps:これは単なるサンプルであり、実際の問題には100の製品と1000の企業があります。Excelで転置を行って100個の製品の一時テーブルを作成し、それをMySQLテーブルに変換しました。

以下は私が最終的に頼ったアプローチです。フィードバックをありがとう。

########### Python script to generate the MySQL query ##############

#MySQL Connection String Goes here#

#Generate MySQL 'CASE' logic

cursor = db.cursor()

if __name__ == '__main__':

    cursor.execute("select PID, Product from products")
    productlist = cursor.fetchall()

    for product in productlist:
        print ("max(case when PID = %s then 'Y' else '' end) as `%s`,") % (product[0], product[1])

db.close()

ニックによって提案された形式で生成されたクエリを使用します。

select cid,
max(case when pid = 1 then 'Y' else '' end) as AAA,
max(case when pid = 2 then 'Y' else '' end) as ABC,
max(case when pid = 3 then 'Y' else '' end) as BAC,
max(case when pid = 4 then 'Y' else '' end) as CAB,
max(case when pid = 5 then 'Y' else '' end) as CBA
from companies
group by cid
4

5 に答える 5

3
select cid,
max(case when pid = 1 then 'Y' else '' end) as AAA,
max(case when pid = 2 then 'Y' else '' end) as ABC,
max(case when pid = 3 then 'Y' else '' end) as BAC,
max(case when pid = 4 then 'Y' else '' end) as CAB,
max(case when pid = 5 then 'Y' else '' end) as CBA
from companies
group by cid
于 2011-08-15T19:47:20.490 に答える
2

他の答えが踊っているように見えるのは、大量の製品の場合、MySQLだけでこれを行う実際的な方法がないという事実です。

この質問への回答を参照してください:MySQLの行を列に転置する

したがって、あなたの質問に対する答えはおそらく次のとおりです。先に進んで、そのPythonスクリプトを記述してください。

于 2011-08-15T19:58:28.607 に答える
0

なぜ重複データがあるのですか?2回、11と23があります。

このようにデータを表現したいという気持ちがわかりません。UIで表現する場合、それは悪い考えです。私が言うPythonに固執し、1つのループで実行します:1)テーブルを作成します2)データをフェッチします3)foreachの結果はselect cid、pid...の結果セットになりますテーブルに「Y」を付けます

于 2011-08-15T19:55:19.343 に答える
0

これにより、すべての結果が5(または100)ではなく1つの列に連結されます。

SELECT
    o.CID
  , GROUP_CONCAT( CASE WHEN d.dummy IS NOT NULL 
                       THEN ' Y '
                       ELSE '   '
                  END 
                  ORDER BY p.Product
                  SEPARATOR ' '
                ) AS Products
FROM
    ( SELECT DISTINCT 
          CID
      FROM Ordering
    ) AS c
  CROSS JOIN 
    Product p
  LEFT JOIN 
    (SELECT 1 AS dummy) AS d
      ON EXISTS
         ( SELECT *
           FROM Ordering AS o
           WHERE o.PID = p.PID
             AND o.CID = c.CID
         )
GROUP BY c.CID

ただし、100の製品と1万の企業がある場合、それは地獄のように遅いかもしれません。

于 2011-08-15T22:57:31.950 に答える
-1

希望する結果についてはよくわかりませんが、MySQLを使用して同様の結果を作成するのはかなり簡単ですGROUP BY。これにより、Pythonで目的のビューを簡単に作成できる可能性があります。

SELECT orders.cid, products.product
FROM orders, products
WHERE orders.pid=products.pid
GROUP BY products.product
于 2011-08-15T19:50:00.117 に答える